VERSIO:: VAL 2 < NUMERO DE VERSION, DONNANT LA NATURE < DES ALGORITHMES UTILISES... XXV1:: VAL 1 < VERSION 1... XXV2:: VAL 2 < VERSION 2... NMTZ: VAL "T5" NMP: VAL " H" IF NMPROC-NMTZ,,XWOR%, IF NMPROC-NMP,,XWOR%, IF ATTENTION : 'NMPROC' EST MAUVAIS !!! XWOR%: VAL 0 IF NMPROC-NMTZ,XWOR%9,,XWOR%9 IDP "T5 - VERSION TRANSFORMATION PAR CONTOUR DE TW" XWOR%9: VAL 0 IF NMPROC-NMP,XWOR%9,,XWOR%9 IDP " H - VERSION DE 'T5' INTERPRETATIVE" XWOR%9: VAL 0 IDP "RELEASE 27/05/1980" EOT #SIP DEFINITION CMS5# EOT #SIP DEF PROCESSEUR# PROG WORD TW < POINT D'ENTREE... WORD 0 PTW: EQU $ < DOIT VALOIR '12... LRP L BR -2,L < ENTREE DANS LE PROCESSEUR... EOT #SIP DEFINITION ITEM# ITEM2: EQU ZERO+PILE-LTNI-LTNI ITEM1: EQU ITEM2+LTNI EOT #SIP IMAGE 256# NBITMO: VAL 16 < NOMBRE DE BITS PAR MOT. NOCMO: VAL 2 < NOMBRE D'OCTETS PAR MOT... NBITOC: VAL NBITMO/NOCMO < NOMBRE DE BITS PAR OCTET... NBRHEX: VAL 4 < NOMBRE DE CHIFFRES HEXAS PAR MOT. BIT: VAL 1 NMOTL: VAL CNMPL < NOMBRE DE MOTS PAR LIGNE. NLIG: VAL LIMAG/NMOTL < NOMBRE DE LIGNES PAR TRAME. NLIGM1: VAL NLIG-1 < ORDONNEE MAXIMALE. XWOR%1: VAL NLIGM1+1 XWOR%2: VAL XWOR%1=0 IF BIT>XWOR%2-XWOR%1,,XWOR%, IF ATTENTION : 'NLIGM1' DOIT ETRE UN MASQUE !!! XWOR%: VAL 0 NPOLM1: VAL NMOTL*NBITMO-1 < ABSCISSE MAXIMALE. XWOR%1: VAL NPOLM1+1 XWOR%2: VAL XWOR%1=0 IF BIT>XWOR%2-XWOR%1,,XWOR%, IF ATTENTION : 'NPOLM1' DOIT ETRE UN MASQUE !!! XWOR%: VAL 0 NCOOL: VAL 3 < NOMBRE DE COULEURS DE BASE. NIVMAX: VAL BIT>NCOOL-BIT < NIVEAU MAX RECONNU. MFFFF: VAL 'FFFF < MASQUE DU MOT. EOT: VAL '04 < CARACTERE 'EOT'. SGNDLN: VAL 3 < FONCTION DE DELETE SGN, SGNSTN: VAL 4 < FONCTION DE STORE SGN, SGNLON: VAL 5 < FONCTION DE LOAD SOUS ACN SGN, SGNLNS: VAL 6 < FONCTION DE LOAD SOUS :SYS SGN. PAGE < < < S E L E C T I O N D U M O D E D ' E N T R E E : < < NMPROD: VAL NMPROC < SAUVEGARDE DU NOM REEL DU PROCESSEUR, < ON NE SAIT JAMAIS ??!?!?!? VISU: VAL 0 < MODE D'ENTREE PAR LA VISU, ITEM: VAL 1 < MODE D'ENTREE PAR L'ITEM1. MODE: VAL VISU < A PRIORI, 'TW'/'TX' : ENTREE VISU... IF NMPROC-NMP,XWOR%,,XWOR% NMPROC: VAL NMTZ < SI " 3", ON LE REMPLACE PAR "T3", MODE: VAL ITEM < AVEC ENTREE PAR L'ITEM1. XWOR%: VAL 0 PAGE < < < D E F I N I T I O N D E L ' I M A G E : < < NOM: EQU ZERO+PILE+5-LNOM IMAG: EQU NOM+LNOM IMAGE: EQU IMAG IMAGR: EQU IMAGE+0 IMAGV: EQU IMAGR+LIMAG IMAGB: EQU IMAGV+LIMAG TV1:: VAL 0 < ADRESSE DE LA MEMOIRE DE VISUALISATION < EN 'CDAI'. IF TV1-0,,XWOR%, IF TV1 DOIT ETRE NUL, SINON, DE NOMBREUSES IF SEQUENCES DE CODE SONT MAUVAISES !!! XWOR%: VAL 0 AMASK:: VAL NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'. IZBUF:: VAL AMASK+LIMAG < DEBUT DU BLOC COURANT DU Z-BUFFER DANS < LA 'CDA' QUAND ON EST EN '!CDAI'... LIZBUF:: VAL '1000 < LE Z-BUFFER EST DECOUPE EN BLOCS DE < 4K MOTS, NZBUF:: VAL 16 < CE QUI FAIT DONC 16 BLOCS... XWOR%1: VAL 1024 XWOR%2: VAL LIZBUF/XWOR%1*NZBUF XWOR%3: VAL LIMAG/XWOR%1*NBITMO IF XWOR%3-XWOR%2,,XWOR%, IF ATTENTION : LIZBUF ET NZBUF INCOMPATIBLES !!! XWOR%: VAL 0 LSDKU:: VAL 128 NSDKU:: VAL LIZBUF/LSDKU < INCREMENT DE PASSAGE D'UN BLOC DU < Z-BUFFER AU SUIVANT SUR 'DKU'... TV2:: VAL IZBUF+LIZBUF < ADRESSE DE LA DEUXIEME IMAGE SCRATCH < UTILISEE EN PARTICULIER POUR LA MODU- < LATION D'AMPLITUDE SUR LA NORMALE. LNOMP: VAL LNOM-1 < LONGUEUR UTILE DU NOM (A CAUSE DE < L'EOT A PRIORI... PROG PAGE < < < M E S S A G E S : < < MMCDA: BYTE 5;'6D MCDAI: ASCI "!CDA" BYTE "I";EOT REP: DZS NBRHEX/NOCMO < BUFFER DES REPONSES. MERR: BYTE 1;"?" IF MODE-VISU,XWOR%7,,XWOR%7 MINT: BYTE 2;'6D;">";0 MNOM: BYTE 5;'6D ASCI "NOM=" MORGX: BYTE 3;'6D ASCI "X=" MORGY: BYTE 3;'6D ASCI "Y=" MTORE: BYTE 6;'6D ASCI "TORE? " MCAD: BYTE 6;'6D ASCI "NUMC=" MMAX: BYTE 5;'6D ASCI "MAX?" MNIVO: BYTE 5;'6D ASCI "NIV=" MK: BYTE 3;'6D ASCI "K=" MASKO: BYTE 9;'6D ASCI "MASK ON?" MSLAS: BYTE 1;"/" MCX: BYTE 4;'6D ASCI "CX= " MCY: BYTE 4;'6D ASCI "CY= " MIX: BYTE 4;'6D ASCI "IX= " MIY: BYTE 4;'6D ASCI "IY= " MSENS: BYTE 6;'6D;"1";" ";"2";'08;'08 IF VERSIO-XXV2,XWOR%8,,XWOR%8 MOPTC: BYTE 7;'6D ASCI "CX,CY?" MECH: BYTE 9;'6D ASCI "ECH.DYN?" MPAS: BYTE 5;'6D ASCI "PAS=" XWOR%8: VAL 0 MMC: BYTE 5;'6D ASCI "RVB?" MMS: BYTE 6;'6D BYTE "S";" ";"M";'08;'08 XWOR%7: VAL 0 < < ZONE EN RECOUVREMENT : < BUFIN: EQU ITEM2+'518 < BUFFER D'ENTREE DES FONDS. LBUFIN: VAL NBITMO/NOCMO LBUFMH: VAL NPOLM1+1/NBITMO < LONGUEUR DU MASQUE HORIZONTAL, LBUFMV: VAL NLIGM1+1/NBITMO < LONGUEUR DU MASQUE VERTICAL. BUFMH: EQU BUFIN+LBUFIN < MASQUE HORIZONTAL, BUFMV: EQU BUFMH+LBUFMH < MASQUE VERTICAL. LSTACK:: VAL 30 < LONGUEUR DE LA PILE DE TRAVAIL. STACK: EQU BUFMV+LBUFMV < PILE DE TRAVAIL. IF ITEM1-STACK-LSTACK,,,XWOR% IF ATTENTION : LA ZONE EN RECOUVREMENT DE IF L'ITEM2, RECOUVRE AUSSI L'ITEM1 !!! XWOR%: VAL 0 PAGE < < < C O M M O N : < < COMMON COMON: WORD 0 < MOT RESERVE POUR LE BLOC FLOTTANT. < < CONSTANTES : < IF MODE-VISU,XWOR%7,,XWOR%7 NGE: ASCI "GE" < NOM DU PROCESSEUR DE RETOUR. XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 NSD: ASCI "SD" < NOM DE L'OVERLAY D'APPEL. TCALL: WORD "GE";"EI" < NOM DES OVERLAYS DE RETOUR SI ALT-MODE. NCALL: WORD TCALL,X NPCALL: WORD 0 < NOM DU PROCESSEUR DE RETOUR SI ALT-MODE. XWOR%7: VAL 0 SAVEK: WORD 0 < SAUVEGARDE DU REGISTRE 'K'. KIN: WORD -1 < COMPTEUR DES ENTREES... IF MODE-VISU,XWOR%7,,XWOR%7 NMOTS: WORD 2*LTNI < LONGUEUR MOTS DES 2 ITEMS. XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 NMOTS: WORD LTNI < POUR NE RAZER QUE L'ITEM2... XWOR%7: VAL 0 IMASKO: WORD 0 < 0 : MASK OFF, < 1 : MASK ON... < < DONNEES DE GESTION DU MASQUE : < AEMETT: WORD 0 < ADRESSE DE L'EMETTEUR, ARECEP: WORD 0 < ADRESSE DU RECEPTEUR. IF MODE-ITEM,XWOR%7,,XWOR%7 < < DONNEES DE SIMULATION DES ENTREES : < IEG: WORD 0 < INDEX COURANT DE L'ITEM1. NCP: WORD NBCAR*NBLIG-LNOM < LONGUEUR MAX D'UN ITEM, < ON RETRANCHE LNOM, CAR LE NOM < D'UNE IMAGE DOIT ETRE IMPERATIVEMENT < DEVANT L'IMAGE... AI1: WORD ITEM1+LTN,X < RELAI D'ACCES A L'ITEM1. ABUFC: WORD 0 < RELAI D'ACCES AU BUFFER COURANT. XWOR%7: VAL 0 < < RELAIS DE TABLES, D'IMAGES... < ACOM: WORD KOM,X < TABLE DES COMMANDES RECONNUES. AMERR: EQU MERR < MESSAGE D'ERREUR. IF MODE-VISU,XWOR%7,,XWOR%7 AMINT: EQU MINT < MESSAGE D'INVITATION. AMNOM: EQU MNOM < "NOM=" AMORGX: EQU MORGX < "ORGX=" AMORGY: EQU MORGY < "ORGY=" AMTORE: EQU MTORE < "TORE?" AMCAD: EQU MCAD < "NUMC=" AMMAX: EQU MMAX < "MAX?" AMNIVO: EQU MNIVO < "NIVEAUX=" AMASKO: EQU MASKO < "MASK ON?" AMSLAS: EQU MSLAS < "/" AMCX: EQU MCX < "CX=" AMCY: EQU MCY < "CY=" AMIX: EQU MIX < "IX=" AMIY: EQU MIY < "IY=" AMSENS: EQU MSENS < "1 2" IF VERSIO-XXV2,XWOR%8,,XWOR%8 AMOPTC: EQU MOPTC < "CX,CY?" AMECH: EQU MECH < "ECHELLE DYNAMIQUE?" AMPAS: EQU MPAS < "PAS=" XWOR%8: VAL 0 AMK: EQU MK < "K=" AMMC: EQU MMC < "RVB?" AMMS: EQU MMS < "S M" XWOR%7: VAL 0 AREP: WORD REP < ACCES AU BUFFER DE REPONSE... AREPX: WORD REP,X < DE MEME EN INDEXE... ABUFIN: WORD BUFIN,X < ACCES AU BUFFER DE GENERATION DU FOND. AMCDAI: EQU MCDAI < !CDAI. AMMCDA: EQU MMCDA < !CDA. AITEM2: WORD ITEM2-1,X < POUR RAZER LES ITEMS 1 ET 2. AEOT: WORD NOM+LNOMP < POUR FORCER UN EOT... < < RELAIS DE SOUS-PROGRAMMES : < AOVL: WORD OVL < CHARGEMENT DES OVERLAYS... IF MODE-VISU,XWOR%7,,XWOR%7 APRINT: WORD PRINT < EDITION D'UN MESSAGE. XWOR%7: VAL 0 AENTER: WORD ENTER < ENTREE DE QUELQUE CHOSE SUR LA VISU... AIN: WORD IN < ENTREE D'UN CARACTERE, AIHEX: WORD IHEX < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX, IF MODE-VISU,XWOR%7,,XWOR%7 APIN: WORD PIN < EDITION MESSAGE+ENTREE 1 CARACTERE. APIHEX: WORD PIHEX < EDITION MESSAGE+ENTREE 4 CHIFFRES. XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 APIN: EQU AIN APIHEX: EQU AIHEX XWOR%7: VAL 0 AIFLOT: WORD IFLOT < ENTREE D'UNE CONSTANTE FLOTTANTE. AHEX: WORD HEX < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE ACCI: WORD CCI < ACCES AU CCI. AGOSGN: WORD GOSGN < POUR ACCEDER AU SGN... ASPSCD: WORD SPSCD < TRANSFERT BRUTAL EN SCRATCH. ASPACD: WORD SPACD < TRANSFERT EN RESIDENT AVEC MASQUE, ASPBCD: WORD SPBCD < TRANSFERT EN RESIDENT SANS MASQUE. APMOV5: WORD PMOV5 < TV R --> RESIDENT, APMOV6: WORD PMOV6 < TV V --> RESIDENT, APMOV7: WORD PMOV7 < TV B --> RESIDENT. ASP: WORD 0 < RELAI VARIABLE CONTENANT L'ADRESSE DE < L'UN DES SOUS-PROGRAMMES PRECEDENTS. ASPOP: WORD SPOP < OPERATIONS INTER-IMAGES... ALOOP: WORD LOOP < BOUCLE DE L'INTERROGATION. IF MODE-ITEM,XWOR%7,,XWOR%7 AALTM: WORD ALTM < TRAITEMENT DES RETOURS BRUTAUX... XWOR%7: VAL 0 < < DEMANDES A CMS5 : < DEMIN: WORD '0101 < ENTREE D'UN CARACTERE DE REPONSE. WORD REP-ZERO*NOCMO WORD 1 DEMHEX: WORD '0101 < ENTREE D'UN NOMBRE HEXA-DECIMAL. WORD REP-ZERO*NOCMO WORD NBRHEX DEMOUT: WORD '0202 < ECRITURE D'UN MESSAGE SUR LA VISU. WORD MERR-ZERO*NOCMO+1 WORD 1 < MESSAGE D'ERREUR POUR " P"... DEMMEM: WORD 4 < DEMANDE DE 16 K MOTS... RELMEM: WORD 4 < RETOUR A 4K MOTS... WORD '8000 WORD '2000 IF MODE-VISU,XWOR%7,,XWOR%7 NOMBB:: VAL "K" < NOM DE LA BRANCHE D'OVERLAY. NOMOV1:: VAL " ">NBITOC?NOMBB XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 NOMBB:: VAL "U" < NOM DE LA BRANCHE D'OVERLAY. NOMOV1:: VAL " ">NBITOC?NOMBB XWOR%7: VAL 0 DEMCC: WORD 2 < ACCES AU CCI INTERPRETATIF. WORD 0 < ADRESSE DE LA CARTE. WORD 80 NOMIN: WORD '0101 < ENTREE DU NOM D'UNE IMAGE. WORD NOM-ZERO*NOCMO WORD LNOMP*NOCMO SGN: WORD '0002 < POUR LES ACCES AU SGN. WORD NOM-ZERO*NOCMO WORD LIMAG*NCOOL+LNOM*NOCMO WORD -1 < LA VALEUR SUIT LE NOM... TVDKU: VAL '8A01 < ACCES A 'DKU' POUR LA 'TV'. DEMTVR: WORD TVDKU < ACCES AU ROUGE. WORD IMAGR-ZERO*NOCMO WORD LIMAG*NOCMO WORD TVPR DEMTVV: WORD TVDKU < ACCES AU VERT. WORD IMAGV-ZERO*NOCMO WORD LIMAG*NOCMO WORD TVPV DEMTVB: WORD TVDKU < ACCES AU BLEU. WORD IMAGB-ZERO*NOCMO WORD LIMAG*NOCMO WORD TVPB DEMOVL: BYTE '80?SGNLNS;'02 < CHARGEMENT DE L'OVERLAY DE 'TZ'. WORD OVLTZ2 WORD LOVL2 WORD -1 DEMLOD: BYTE '80?SGNLNS;'02 < DEMANDE DE CHARGEMENT DE "GE". WORD BRANCH-ZERO*NOCMO WORD ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO WORD -1 IF MODE-ITEM,XWOR%7,,XWOR%7 SITEM1: DZS LNOM/NOCMO < POUR SAUVEGARDER LA FIN DE L'ITEM1. XWOR%7: VAL 0 < < ACCES AU Z-BUFFER : < ZBUF: WORD 0 < 0 : Z-BUFFER ACTIF (MODE NORMAL)... < 1 : INACTIF, MAIS DANGEREUX... RDKU: BYTE '8A;'0C < 'DKU' --> 'MEMTV' EN QUANTA=1. WORD IZBUF*NOCMO WORD LIZBUF*NOCMO WORD 0 WDKU: BYTE '8A;'0E < 'MEMTV' --> 'DKU' EN QUANTA=1. WORD IZBUF*NOCMO WORD LIZBUF*NOCMO WORD 0 SDKU: WORD -1 < NUMERO DU BLOC COURANT, N'EXISTE PAS < AU CHARGEMENT. MDKU: WORD 0 < COMPTAGE DES MODIFS DU BLOC COURANT. XZMAX:: VAL '7FFF < PLUS GRAND NOMBRE ENTIER POSITIF. ZMAX: WORD XZMAX < PLUS GRAND NOMBRE POSITIF... ASPDKU: WORD SPDKU < ECRITURE DU BLOC COURANT... AGZB: WORD GZB < ACCES GENERAL AU Z-BUFFER... < < CONSTANTES UTILES : < XR: WORD 0 < COORDONNEE X D'UN POINT RESIDENT, YR: WORD 0 < COORDONNEE Y D'UN POINT RESIDENT, XS: WORD 0 < COORDONNEE X D'UN POINT SCRATCH, YS: WORD 0 < COORDONNEE Y D'UN POINT SCRATCH. ORGX: WORD 0 < ORIGINE EN X DE L'IMAGE SCRATCH < PAR RAPPORT A L'IMAGE RESIDENTE, ORGY: WORD 0 < DE MEME, ORIGINE EN Y... IF VERSIO-XXV1,XWOR%8,,XWOR%8 CX: WORD 0 < COORDONNEES DU CENTRE POLAIRE CY: WORD 0 < DES CONTOURS EXTRAITS. XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 XICXCY:: VAL 2 < ON UTILISE (CX,CY) JUSQU'AU CONTOUR < C(XICXCY) INCLUS. ICXCY: WORD 0 < 0 : UTILISER (CX,CY), < 1 : NE PAS UTILISER (CX,CY). < -1 : MODE AUTOMATIQUE : (CX,CY) EST < CALCULE AU MILIEU DU PLUS GRANS < SEGMENT CONTENU DANS LE CONTOUR < (VOIR 'ECHELLE DYNAMIQUE'). CX: FLOAT 0 < COORDONNEE DU CENTRE POLAIRE CY: FLOAT 0 < ARBITRAIRE DES CONTOURS EXTRAITS. XWOR%8: VAL 0 IX: WORD 0 < COORDONNEES DU CENTRE POLAIRE IY: WORD 0 < DE L'IMAGE RESIDENTE. SENS: WORD 0 < INDICATEUR DU SENS DES OPERATIONS : < 0 : 2 --> 1, < 1 : 1 --> 2. (TV1 ET TV2). IF VERSIO-XXV2,XWOR%8,,XWOR%8 XPAS:: VAL 8 < VALEUR MAX DU PAS... PAS: WORD XPAS < PAS DE MODIFICATION DES QUATRE < CONSATNTES SUIVANTES : MINX: WORD 0 MAXX: WORD NPOLM1 MINY: WORD 0 MAXY: WORD NLIGM1 XWOR%8: VAL 0 < < DONNEES POUR LA GESTION DES "MATRICES" D'IMAGES : < ZNIMA:: VAL 2 XNIMA:: VAL 2*2 < ON DEFINIT UNE MATRICE 2*2... YNIMA:: VAL XNIMA=0/ZNIMA XWOR%1: VAL YNIMA*ZNIMA IF BIT>XWOR%1-XNIMA,,XWOR%, IF ATTENTION : 'XNIMA' DOIT ETRE UNE PUISSANCE DE 2 !!! XWOR%: VAL 0 CADN: WORD XNIMA < NOMBRE DE POINTS PAR PAVE. CADX: WORD 0 < ORIGINE EN X DU CADRE, CADY: WORD 0 < ORIGINE EN Y DU CADRE. CADNIV: WORD 0 < CUMUL DES NIVEAUX D'UN PAVE. IMAX: WORD 0 < 0 : CALCUL PAR MOYENNAGE, < 1 : PRISE DU MAX SUR LE PAVE. MAX: WORD 0 < MAX RENCONTRE DANS UN PAVE. LNIV: WORD 0 < LISTE DES NIVEAUX A LAISSER INTACT : < SI LE BIT DE RANG 'X' EST A 1, LES POINTS < DE NIVEAU 'X' SERONT INTOUCHES DANS < L'IMAGE SCRATCH... < SI LE BIT DE RANG 'X'+NIVMAX+1 EST A 1, < ON IGNORE LES NIVEAUX CALCULES QUI VALENT < (X) ; ON PEUT AINSI PAR EXEMPLE EVITER < DE MARQUER DU NOIR PAR '0080... < < POUR ACCEDER AUX IMAGES : < SAVER: WORD 0 < SAUVEGARDE D'UN MOT DE LA TRAME < RESIDENTE ROUGE, SAVEV: WORD 0 < DE MEME POUR LE VERT, SAVEB: WORD 0 < DE MEME POUR LE BLEU. MCDAR: EQU SAVER < SAUVEGARDE D'UN MOT DE LA TRAME < SCRATCH ROUGE, MCDAV: EQU SAVEV < DE MEME POUR LE VERT, MCDAB: EQU SAVEB < DE MEME POUR LE BLEU. XCTCDA: WORD 0 CTCDA: WORD TV2-TV1 < POUR ATTEINDRE 'TV2'... MODX: WORD 1 < 0 : "TORE" SUR LES X, < 1 : L'IMAGE SCRATCH NE SE REFERME PAS... MODY: WORD 1 < DE MEME SUR L'AXE DES Y. WORK1: WORD 0 < VARIABLE DE TRAVAIL... FWORK: FLOAT 0 < VARIABLE DE TRAVAIL... MCDAM: WORD 0 < MOT COURANT DE LA 'CDA'. AIMAGR: WORD IMAGR,X < RELAI TRAME ROUGE, AIMAGV: WORD IMAGV,X < RELAI TRAME VERTE, AIMAGB: WORD IMAGB,X < RELAI TRAME BLEUE. < < RELAIS : < ASPAPR: WORD SPAPR < ACCES A UN POINT RESIDENT (X,Y). ASPAPS: WORD SPAPS < ACCES A UN POINT SCRATCH (X,Y). ASPSPR: WORD SPSPR < RANGEMENT D'UN POINT RESIDENT (X,Y). ASPSPS: WORD SPSPS < RANGEMENT D'UN POINT SCRATCH (X,Y). ASPGPR: EQU ASPAPR ASPGPS: EQU ASPAPS ASPRPR: EQU ASPSPR ASPRPS: EQU ASPSPS ARAC: WORD RAC < EXTRACTION D'UNE RACINE CARREE... < < SOUS-PROGRAMMES SPECIFIQUES : < AROND: WORD ROND < ARRONDI FLOTTANT ET CONVERSION ENTIERE. < < DONNEES D'ARRONDI : < F05: FLOAT 0.5 < < DONNEES POUR LA FONCTION : < FK: FLOAT 1 F0: FLOAT 0 DELTAX: FLOAT 0 DELTAY: FLOAT 0 FIX: FLOAT 0 < PAS D'INCREMENTATION DES X, FIY: FLOAT 0 < PAS D'INCREMENTATION DES Y. FX: FLOAT 0 < COORDONNEE X, FY: FLOAT 0 < COORDONNEE Y. IF VERSIO-XXV1,XWOR%8,,XWOR%8 GELTAX: FLOAT 0 GELTAY: FLOAT 0 XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 < < DONNEES DE COMPTAGE ET D'EVALUATION < DE LA DISTANCE DU CONTOUR COURANT < C(N) AU CONTOUR INITIAL C(0) : < IC0: WORD 0 < 0 : ON TRAVAILLE SUR C(0), < N : ON TRAVAILLE SUR C(N). NPC0: WORD 0 < NOMBRE DE POINTS DE C(0), NPCNM1: WORD 0 < NOMBRE DE POINTS DE C(N-1), NPCN: WORD 0 < NOMBRE DE POINTS DE C(N). SAVEX: WORD 0 < SAUVEGARDE DE X, SAVEY: WORD 0 < SAUVEGARDE DE Y. FCOREC: FLOAT 0 < FACTEUR CORRECTIF... FWORK1: FLOAT 0 FWORK2: FLOAT 0 FWORK3: FLOAT 0 F1: FLOAT 1 X0Y0: WORD 0 < NUMERO DU POINT INITIAL CALCULE SUR C(0). SXY: WORD 0 < POUR SAUVEGARDER LE NUMERO DU POINT < COURANT SUR C(0)... MXY: WORD 0 < POUR MEMORISER LE NUMERO DU POINT DE C(0) < DE PLUS FAIBLE LONGUEUR. FKOREC: FLOAT 0 < FACTEUR CORRECTIF... DELTA: WORD 0 < ABS(MXY-X0Y0). IXY: WORD 0 < PAS DE PASSAGE EN ALTERNANCE D'UN < POINT DE C(0) A UN AUTRE A PARTIR DU < POINT INITIAL 'X0Y0'. MIXY:: VAL 64 < VALEUR MAX DE 'IXY'. AMIXY: WORD MIXY SAMIXY: WORD 0 < SAUVEGARDE DE 'AMIXY' AU DEBUT DE < CHAQUE TOUR DE REMPLISSAGE... LXY: FLOAT 0 < LONGUEUR MINIMALE RENCONTREE. IFECH: WORD 0 < 0 : LE FACTEUR D'ECHELLE SERA 'FK', < 1 : LE FACTEUR D'ECHELLE SERA CALCULE < PAR UN RAPPORT DE PLUS GRANDES < LONGUEURS DANS LE CONTOUR C(0). < -1 : LE FACTEUR D'ECHELLE EST CALCULE < POUR CHAQUE POINT DE C(N). FECH: FLOAT 0 RLXY0: FLOAT 0 < MODULE(M(C(N)),M(C(0))), RLXY0P: FLOAT 0 < MODULE(M(C(N)),MP(C(0))), RLXY0S: FLOAT 0 < MIN(MODULE(M(C(N)),MP(C(0)))), FMAX: FLOAT <NLIGM1?NPOLM1*15/10<0<0 XN0: FLOAT 0 < X(M(C(N)),M(C(0))), YN0: FLOAT 0 < Y(M(C(N)),M(C(0))). FEPS0: FLOAT -0.9995 < SEUIL INITIAL DES COSINUS, FEPS: FLOAT 0 < SEUIL COURANT DES COSINUS, F005: FLOAT 0.0005 < POUR CALCULER 'FEPS'... MXYS: WORD 0 < NUMERO DU POINT MP(C(0)). LPILEM:: VAL 1 < LONGUEUR DE LA PILE DES POINTS CORRES- < PONDANT A DES LONGUEURS MINIS MAIS < IDENTIQUES. PILEM0: BYTE LPILEM;0 < POUR INITIALISER 'PILEM'... PILEM: BYTE LPILEM;0 < POINTEUR DE LA PILE : DZS LPILEM < PILE... APILEM: WORD PILEM < ADRESSE DE LA PILE... AKFECH: WORD KFECH < CALCUL DU FACTEUR D'ECHELLE SI IFECH=-1. ASPNUM: WORD SPNUM < NUMERO D'UN POINT SUR C(0). LVOIS:: VAL 3 < AMPLITUDE DU VOISINNAGE QUE L'ON VA < EXPLORER AUTOUR DU POINT MINI DONT < LE NUMERO EST (A) ; ON FAIT AINSI POUR < MINIMISER LES EFFETS DE LA NUMERISATION < DU CONTOUR, EN L'APPROXIMANT PAR UNE < DROITE TANGENTE... NVOIS:: VAL LVOIS*2+1 < NOMBRE DE POINTS VOISINS... ANVOIS: FLOAT <NVOIS<0<0 AGZBL: WORD GZBL < LOAD UN MOT DU Z-BUFFER, ET DECONCATENA- < TION DES COORDONNEES X ET Y. ASPL: WORD SPL < SOUS-PROGRAMME DE CALCUL DU CARRE DE < LA LONGUEUR DE C(N) A C(0). ASPLM: WORD SPLM < CALCUL DE LA LONGUEUR MINIMALE NON NULLE. XWOR%8: VAL 0 PAGE < < < T A B L E D E S C O M M A N D E S : < < REP0: VAL "+" < PREMIERE COMMANDE. KOM: EQU $-REP0 < ELLES COMMENCENT A "+"... WORD STORE < + : STORE SGN LE RESIDENT AERROR: WORD ERROR < , WORD DELETE < - : DELETE SGN LE RESIDENT WORD ERROR <. WORD ERROR < / WORD MOV0 < 0 : TV <-- RESIDENT R+V+B WORD MOV1 < 1 : TV <-- RESIDENT R WORD MOV2 < 2 : TV <-- RESIDENT V WORD MOV3 < 3 : TV <-- RESIDENT B WORD MOV4 < 4 : RESIDENT <-- TV R+V+B WORD MOV5 < 5 : RESIDENT <-- TV R WORD MOV6 < 6 : RESIDENT <-- TV V WORD MOV7 < 7 : RESIDENT <-- TV B WORD STV2 < 8 : TV2 <-- RESIDENT WORD GTV2 < 9 : RESIDENT <-- TV2 WORD ERROR < : WORD ERROR < ; WORD ERROR < < WORD CENTRE < = : DEFINITION DE (CX,CY) ET (IX,IY) WORD ERROR < > WORD ERROR < ? WORD ERROR < @ WORD ERROR < A WORD ERROR < B WORD CADRE < C : GENERATION DES MATRICES D'IMAGE WORD DISP < D : RESIDENT <-- IMAGE SGN WORD ERROR < E WORD GOGE < F : FIN WORD ERROR < G WORD ERROR < H WORD ERROR < I WORD ERROR < J WORD INFK < K : ENTREE CTTE TRANSFORMATION WORD IMLOAD < L : RESIDENT <-- (SCRATCH) SANS MASQUE WORD MASK < M : GET/STORE LE MASQUE WORD NAME < N : NOMME L'IMAGE RESIDENTE WORD ERROR < O WORD ERROR < P WORD ERROR < Q WORD ERROR < R WORD IMSAV < S : SCRATCH <-- (RESIDENT) WORD CONTO < T : TRANSFORMATION SUIVANT UN CONTOUR WORD IMUP < U : RESIDENT <-- (SCRATCH) AVEC MASQUE WORD ERROR < V WORD GOCCI < W : RETOUR TEMPORAIRE AU CCI WORD GORGX < X : POSITIONNEMENT DE 'ORGX' WORD GORGY < Y : POSITIONNEMENT DE 'ORGY' WORD ERROR < Z REPZ: VAL $-KOM-1 < DERNIERE COMMANDE. PAGE PROG PAGE < < < E N T R E E D E Q U E L Q U E C H O S E : < < < ARGUMENT : < A=ADRESSE DE LA DEMANDE. < < IF MODE-VISU,XWOR%7,,XWOR%7 ENTER: EQU $ PSR X SVC 0 < ENVOI DE LA DEMANDE... PLR X RSR XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 ENTER: EQU $ PSR A,X,Y,W LR A,W < W=ADRESSE DE LA DEMANDE : LRM A WORD '0101 CP 0,W < EST-CE BIEN UNE ENTREE AVEC ECHO < SUR LA VISU UTILISATEUR ??? JE ENTER1 < OUI... QUIT 1 < NON, ???!???! ENTER1: EQU $ LA 1,W < A=ADRESSE OCTET DU BUFFER, LYI 0 < Y=INDEX DU BUFFER, SLRS NOCMO=0 < CONVERSION EN UNE ADRESSE MOT, ADCR Y < Y=INDEX INITIAL DU BUFFER COURANT. SBT 0 < MISE EN PLACE DU BIT INDEX, STA ABUFC < ET GENERATION DU RELAI VERS LE BUFFER. LX 2,W < X=NOMBRE D'OCTETS MAX A DEPLACER... ENTER2: EQU $ PSR X LA IEG < A=INDEX COURANT DE L'ITEM1, CP NCP < ET VALIDATION ??? JL ENTER3 < OK... BR AALTM < NON, ON FAIT COMME SI UN ALT-MODE < ETAIT ARRIVE... ENTER3: EQU $ IC IEG < PROGRESSION DE L'INDEX DE L'ITEM1. LR A,X < X=INDEX D'ACCES A L'ITEM1, LBY &AI1 < A=CARACTERE COURANT DE L'ITEM1, CPI " " < EST-CE L'ELEMENT NEUTRE ??? JNE ENTER6 < NON... PLR X < OUI, LR X,A CP 2,W < EST-ON EN TETE DU MESSAGE ??? JE ENTER2 < OUI, ON IGNORE LE 'SPACE'... PSR X < NON, ON LE CONSERVE... LAI " " < RESTAURATION DE 'A'... ENTER6: EQU $ CPI ";" < EST-CE LA FIN DE MESSAGE ??? JNE ENTER4 < NON, LAI '04 < OUI, ON LE REMPLACE PAR 'EOT'... ENTER4: EQU $ LR Y,X STBY &ABUFC < ET RANGEMENT DANS LE BUFFER... ADRI 1,Y < PROGRESSION DE L'INDEX BUFFER. PLR X CPI '04 < EST-CE UNE FIN DE MESSAGE ??? JE ENTER5 < OUI, ON ARRETE LA... JDX ENTER2 < NON, ON CONTINUE... ENTER5: EQU $ PLR A,X,Y,W RSR XWOR%7: VAL 0 PAGE < < < E N V O I D ' U N E C A R T E A U C C I : < < < ARGUMENT : < A=ADRESSE MOT DE LA CARTE. < < CCI: EQU $ ADR A,A < CONVERSION EN UNE ADRESSE OCTET. STA DEMCC+1 LAD DEMCC SVC 0 < ET ENVOI DE LA CARTE... RSR PAGE < < < R E T O U R A ' G E ' : < < GOGE: EQU $ IF MODE-ITEM,XWOR%7,,XWOR%7 LAI BRANCH-ZERO LR A,W < W=ADRESSE DE LA BRANCHE... LA NSD STA 0,W < GENERATION DU NOM DE L'OVERALY, ACTD 4 < A='IDESC', ORI "0" < CONVERTI EN ASCI, STBY 2,W < QUI FAIT PARTIE DU NOM... LAI SGNLON STBY DEMLOD < MISE EN MODE 'LOAD SOUS ACN'... STZ CDRET,W < RETOUR OK... GOGE2: EQU $ LRM A,B,X WORD SITEM1 < A=ZONE DE SAUVEGARDE, WORD NOM < B=ZONE A RESTAURER, WORD LNOM/NOCMO < X=NOMBRE DE MOTS A RESTAURER. MOVE < RESTAURATION DU BOUT DE L'ITEM1... LX NMOTS GOGE3: EQU $ STZ &AITEM2 < RAZ DE L'ITEM2... JDX GOGE3 XWOR%7: VAL 0 LA SAVEK LR A,K < RESTAURATION DE 'K'... IF MODE-VISU,XWOR%7,,XWOR%7 LAD RELMEM SVC 0 < RETOUR A 4K MOTS... LX NMOTS < X=NOMBRE DE MOTS A RAZER... TW2: EQU $ STZ &AITEM2 < RAZE DES ITEMS 1 ET 2. JDX TW2 LAI BRANCH-ZERO LR A,W < RESTAURATION DE 'W'. STZ MODCAL,W < REINITIALISATION DU MODE D'APPEL... LA NGE STA 0,W < MISE EN PLACE DU NOM DE "GE"... XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 LA IEG STA MODCAL,W < RENVOI DE L'INDEX COURANT DE ITEM1, XWOR%7: VAL 0 < < NOTA IMPORTANT : < ON NE REVIENT PLUS A < "!CDA" A CAUSE DE 'PSIMUL' < AFIN QU'IL CONSERVE LA < 'CDAG'... < GOGE1: EQU $ LAD DEMLOD BSR AOVL < ET TENTATIVE DE CHARGEMENT... QUIT 1 < EN CAS D'ERREUR, JMP GOGE1 < ET ON RETENTE... IF MODE-ITEM,XWOR%7,,XWOR%7 < < < T R A I T E M E N T D E S A L T - M O D E S : < < ALTM: EQU $ LAI BRANCH-ZERO LR A,W < W=ADRESSE DE LA BRANCHE... LA NPCALL JANE ALTM1 < OK... LA MODCAL,W < MODCAL EST ENCORE A SA VALEUR INITIALE. LXI 0 < "GE" A PRIORI... TBT 0 < "EI" OU "GE" ??? ADCR X LA &NCALL < A=OVERLAY A APPELER... ALTM1: EQU $ STA 0,W < DANS LE CAS D'UN ALT-MODE, ON REVIENT < DIRECTEMENT A "GE" OU A "EI"... LAI " " < ON RESTAURE, AU CAS OU LE ALT-MODE STBY 2,W < APPARAITRAIT DANS 'GOGE'... LAI SGNLNS < IDEM... STBY DEMLOD LAI 2 STA CDRET,W < TRANSMISSION DU ALT-MODE... JMP GOGE2 XWOR%7: VAL 0 PAGE < < < E N T R Y : < < TW: EQU $ LRM C,L WORD COMON+128 < C=BASE DU COMMON... WORD LOC+128 < L=BASE DU LOCAL... LAD DEMOVL SVC 0 < CHARGEMENT DE LA BRANCHE D'OVERLAY... STZ XCTCDA < AU CAS OU UN MALHEUREUX ALT-MODE... IC KIN < COMPTAGE DES ENTREES : IF MODE-VISU,XWOR%7,,XWOR%7 JG TW1 < CAS DES ALT-MODES... XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 JG ALTM < ABORT IMMEDIAT SUR ALT-MODE... LA CDRET,W < A=RELAI D'ACCES A ITEM1/ITEM2... CP AI1 < SEUL ITEM1 EST AUTORISE... JNE ALTM < L'ITEM2 PROVOQUE UN ABORT... LA MODCAL,W < A=INDEX INITIAL DE L'ITEM1... LXI 0 < "GE" A PRIORI... TBT 0 < "GE" (0) OU "EI" (1) ??? ADCR X RBT 0 STA IEG LA &NCALL STA NPCALL < NOM DU PROCESSEUR A APPELER SUR LA < RECEPTION D'UN ALT-MODE. LRM A,B,X WORD NOM < A=ZONE A SAUVEGARDER, WORD SITEM1 < B=ZONE DE SAUVEGARDE, WORD LNOM/NOCMO < X=NOMBRE DE MOTS. MOVE < SAUVEGARDE... XWOR%7: VAL 0 LR K,A < CAS DE LA PREMIERE, STA SAVEK < SAUVEGARDE DE K... TW1: EQU $ LRM K WORD STACK-1 < INITIALISATION DE K... TW20: EQU $ LAI AMCDAI-ZERO BSR ACCI < ENVOI DE !CDAI... JNE GOGE < ET BIEN CELA NE MARCHE PAS... STZ IMASKO < MISE DU MASQUE OFF A PRIORI... LAD DEMMEM SVC 0 < PASSAGE A 16 K... LAI '18 WORD '1E15 LR B,X < X=ORIGINE DE LA 'CDAI'. LAI '19 WORD '1E15 SBR X,B XWOR%1: VAL -4 < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI', LRM A WORD IZBUF-TV1>XWOR%1 < A=LONGUEUR NECESSAIRE (IMAGE+MASQUE), CPR A,B < CELA SUFFIT-IL ??? JL GOGE < B<A : INSUFFISANT POUR TRAVAILLER... TW13: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMASKO-ZERO XWOR%7: VAL 0 BSR APIN STZ IMASKO < OFF A PRIORI... CPI "N" JE TW14 < OK, IMASKO=0 ==> OFF... IC IMASKO < A PRIORI, IMASKO=1 ==> ON... CPI "O" JNE TW13 < ?!??!??! TW14: EQU $ LRM W WORD IMAG < W=BASE DE L'IMAGE ROUGE... PAGE < < < B O U C L E D ' I N T E R R O G A T I O N : < < LOOP: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMINT-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA COMMANDE... CPI REP0 < ET VALIDATION... JL TW12 < ERREUR... CPI REPZ < VALIDATION, SUITE... JG TW12 < ERREUR... LR A,X < X=COMMANDE DEMANDEE, BR &ACOM < BRANCHEMENT AU MODULE SPECIFIQUE... TW12: EQU $ < < < T R A I T E M E N T D E S E R R E U R S : < < ERROR: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMERR-ZERO BSR APRINT < ENVOI D'UN MESSAGE D'ERREUR... XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 LAD DEMOUT SVC 0 < EDITION DU MESSAGE D'ERREUR... XWOR%7: VAL 0 BR ALOOP < ET C'EST TOUT... PAGE < < < R E C U P E R A T I O N / G E N E R A T I O N < D U M A S Q U E D ' I M A G E : < < < FONCTION : < CE MODULE PERMET DE GENERER (COMMANDE < ">") OU DE RECUPERER (COMMANDE < "<") LE MASQUE COURANT D'IMAGE < DE, OU A PARTIR DE L'UNE DES 3 COMPOSANTES < 'R', 'V' ET 'B' DE L'IMAGE SCRATCH. < < MASK: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMMC-ZERO BSR APRINT < MESSAGE "STACK?"... XWOR%7: VAL 0 LAD DEMIN BSR AENTER LBY &AREP < A=REPONSE "R"/"V"/"B"... LBI TVPR-1 < B=NUMERO DU STACK DEMANDE... CPI "R" JE MASK1 < "R"... LBI TVPV-1 CPI "V" JE MASK1 < "V"... LBI TVPB-1 CPI "B" JE MASK1 < "B"... MASK2: EQU $ BR AERROR < TRAITEMENT DES ERREURS... MASK1: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMMS-ZERO BSR APRINT < MESSAGE "SENS?"... XWOR%7: VAL 0 LAD DEMIN BSR AENTER SLLD LIMAG=0 < B=ADRESSE DANS LA 'CDA' DU STACK DEMANDE. LRM X,Y WORD LIMAG < X=NOMBRE DE MOTS A DEPLACER, WORD AMASK < Y=ADRESSE DU MASQUE DANS LA 'CDA'. LBY &AREP < A=REPONSE DE "SENS?"... CPI ">" JE MASK3 < ">" : GENERATION... CPI "<" JNE MASK2 < ERREUR... XR B,Y < "<" : RECUPERATION, ON PERMUTE EMETTEUR < ET RECPTEUR... MASK3: EQU $ STB AEMETT < EMETTEUR EN CDA, STY ARECEP < RECEPTEUR EN CDA. LRM B WORD MCDAM < B=ADRESSE DU MOT DE TRANSIT... MASK4: EQU $ PSR X LA AEMETT LXI 1 RCDA LA ARECEP LXI 1 WCDA PLR X IC AEMETT < PROGRESSION DE L'EMETTEUR, IC ARECEP < AINSI QUE DU RECEPTEUR... JDX MASK4 < AU MOT SUIVANT DU MASQUE... BR ALOOP < ET C'EST TOUT... PAGE < < < M O D U L E S D ' A C C E S A U S G N : < < < FONCTION : < PERMETTENT L'ACCES AU SGN < POUR LES IMAGES SUIVANT : < N : NOMME L'IMAGE RESIDENTE, < JUSQU'A UNE COMMANDE 'N' < SUIVANTE, < D : AFFICHE L'IMAGE PRECEDEMMENT < NOMMEE PAR 'N'. < + : CREE L'IMAGE PRECEDEMMENT < NOMMEE PAR 'N', < - : DETRUIT L'IMAGE PRECEDEMMENT < NOMMEE PAR 'N'. < < NAME: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMNOM-ZERO BSR APRINT XWOR%7: VAL 0 LAD NOMIN BSR AENTER < ENTREE DU NOM COURANT, LAI EOT STBY &AEOT < ET ON FORCE A PRIORI UN 'EOT'... BR ALOOP < ET C'EST TOUT... < < SOUS-PROGRAMME GENERAL D'ACCES AU SGN : < (LORS DES 'LNS' ET 'LON', IL REGARDE < SI LA LONGUEUR DE L'IMAGE VAUT EXACTE- < MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE < REITERE L'OPERATION AVEC UN DELTA < NOM-VALEUR DE -1 CORRESPONDANT A UNE < ANCIENNE VERSION DU PROGRAMME) < GOSGN: EQU $ < RESPONSABLE DE TOUS LES ACCES SGN... STBY SGN < MISE EN PLACE DU 'NVP' ARGUMENT, LAI LNOM*NOCMO STA SGN+3 < A PRIORI... LAD SGN SVC 0 < ET ENVOI DE LA DEMANDE... LBY SGN CPI SGNDLN JE GOSGN1 < CAS D'UN DELETE... CPI SGNSTN JE GOSGN1 < CAS D'UN STORE... ACTD 3 < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE, LRM A WORD LIMAG*NCOOL*NOCMO CPR A,B < S'AGIT-IL D'UNE ANCIENNE OU D'UNE < NOUVELLE IMAGE ??? JE GOSGN1 < NOUVELLE : DELTA=LNOM*NOCMO... LAI -1 < ANCIENNE : STA SGN+3 < IL FAUT LA RECUPERER AVEC DELTA=-1... LAD SGN SVC 0 < ON REITERE LE LOAD... GOSGN1: EQU $ CPZR X < TEST DES CONDITIONS DE RETOUR... RSR < < MODULES SPECIFIQUES : < DISP: EQU $ < COMMANDE 'D' : LAI SGNLON < ON COMMENCE PAR L'ACN DU DEMANDEUR, BSR AGOSGN JE DISP1 < OK, IL EXISTE... LAI SGNLNS < NON, ON TENTE SOUS :SYS... BSR AGOSGN JE DISP1 < OK... DISP2: EQU $ BR AERROR < TRAITEMENT DES ERREURS... DISP1: EQU $ BR ALOOP < VERS LA BOUCLE SI OK... DELETE: EQU $ < COMMANDE '-' : LAI SGNDLN DELET1: EQU $ BSR AGOSGN JE DISP1 < OK... JMP DISP2 < ERREUR... STORE: EQU $ < COMMANDE '+' : LAI SGNSTN JMP DELET1 PAGE < < < A C C E S A U Z - B U F F E R : < < < UTILISATION DES REGISTRES : < A=ADRESSE D'UN MOT DANS LE Z-BUFFER (YS/XS), < B=INFORMATION (INT(FZS)) A Y METTRE, OU RESULTAT... < Y=YLOAD/YSTORE SUIVANT LE SENS... < < GZB: EQU $ STB MCDAR < AU CAS OU CE SERAIT 'YSTORE'... PSR A,X LBI 0 XWOR%1: VAL LIZBUF=0 SCLD NBITMO-XWOR%1 < B=NUMERO DE BLOC, SLRS NBITMO-XWOR%1 < A=ADRESSE DANS LE BLOC. XR A,B < A=NUMERO DE BLOC, B=ADRESSE DANS LE BLOC. CP SDKU < LE BLOC DEMANDE EST-IL LE BLOC COURANT ? JE GZB2 < OUI... < < REECRITURE DU BLOC COURANT LORSQU'IL A ETE MODIFIE : < PSR A < SAVE LE BLOC DEMANDE, BSR ASPDKU < ECRITURE DU BLOC COURANT S'IL EXISTE < ET S'IL A ETE MODIFIE... PLR A < RESTAURE LE BLOC DEMANDE... < < LECTURE DU BLOC DEMANDE : < GZB3: EQU $ STA SDKU < NOUVEAU BLOC COURANT, STZ MDKU < PAS ENCORE MODIFIE... XWOR%1: VAL NSDKU=0 SLLS XWOR%1 < CONVERSION EN UNE ADRESSE DKU... STA RDKU+3 LAD RDKU SVC 0 < LECTURE DU BLOC DEMANDE... < < ACCES AU MOT DEMANDE : < GZB2: EQU $ LRM A WORD IZBUF ADR A,B < B=ADRESSE DU MOT DEMANDE DANS LA 'CDAI'. LAD MCDAR XR A,B < A=ADRESSE DU MOT DANS LA 'CDAI', < B=ADRESSE DU MOT OU RANGER/PRENDRE < L'INFORMATION. LXI 1 < X=1 MOT A TRANSFERER... YLOAD:: VAL 0 < MODE LOAD, YSTORE:: VAL 1 < MODE STORE. CPZR Y < QUEL EST LE SENS DE L'OPERATION ??? JE GZB4 < LOAD... IC MDKU < STORE : DANS CE CAS, ON COMPTABILISE < LA MISE A JOUR... WCDA JMP GZB5 GZB4: EQU $ RCDA GZB5: EQU $ LB MCDAR < QUELQUE SOIT LE MODE 'B' EST BON... PLR A,X RSR < < < E C R I T U R E B L O C C O U R A N T : < < SPDKU: EQU $ LA SDKU < A=BLOC COURANT... JAL GZB6 < IL N'EXISTE PAS, ON EST DONC A < L'INITIALISATION, ON NE PEUT < QUE LIRE LE Z-BUFFER SUR 'DKU'... CPZ MDKU < IL EXISTE, ALORS A-T'IL ETE MODIFIE ??? JE GZB6 < NON, INUTILE D'ECRIRE... XWOR%1: VAL NSDKU=0 IF BIT>XWOR%1-NSDKU,,XWOR%, IF ATTENTION : NSDKU DOIT ETRE UNE PUISSANCE DE 2 !!! XWOR%: VAL 0 SLLS XWOR%1 < CONVERSION EN UNE ADRESSE SUR DKU... STA WDKU+3 LAD WDKU SVC 0 < REECRITURE DU BLOC COURANT... JE GZB6 < OK... QUIT 1 < DKU ?!??!??!!! GZB6: EQU $ RSR PAGE < < < A C C E S A U N P O I N T R E S I D E N T : < < < FONCTION : < CE SOUS-PROGRAMME RECONSTITUE < LE NIVEAU ASSOCIE A 3 BITS < PARALLELES. < < < ARGUMENT : < XR,YR = COORDONNEES DU POINT, < < < RESULTAT : < A = NIVEAU DE GRIS DU POINT, SOIT R+V*2+B*4. < < SPAPR: EQU $ PSR B,X,Y LX XR < X=ABSCISSE, LY YR < Y=ORDONNEE. LR X,A < A=COORDONNEE X, LBI 0 XWOR%1: VAL NBITMO=0 SCLD NBITMO-XWOR%1 < B=NUMERO DE MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 < A=NUMERO DE BIT DANS LE MOT, LXI NBITMO-BIT SBR A,X < X=DECALAGE D'ACCES AU BIT COURANT. XR Y,B < Y=NUMERO DU MOT DANS LA LIGNE, SLLD NMOTL=0 IF NBITMO-NMOTL,,XWOR%, IF ATTENTION : LA CONCATENATION QUI SUIT EST COMPLETEMENT IF STUPIDE !!! XWOR%: VAL 0 ORR B,Y < Y=NUMERO DU MOT DANS LA TRAME. XR Y,X LA &AIMAGB < ACCES A LA TRAME BLEU, PSR A LA &AIMAGV < ACCES A LA TRAME BLEUE, PSR A LA &AIMAGR < ACCES A LA TRAME ROUGE. XR X,Y SLRS 0,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, PLR A SLRS 0,X SLRD BIT < RECUPERATION D'UN BIT VERT, PLR A SLRS 0,X ANDI BIT < RECUPERATION D'UN BIT BLEU. SLLD NCOOL-BIT < A=NIVEAU DE GRIS DU POINT (X,Y). PLR B,X,Y RSR PAGE < < < A C C E S A U N P O I N T S C R A T C H : < < < FONCTION : < CE SOUS-PROGRAMME RECONSTITUE < LE NIVEAU ASSOCIE A 3 BITS < PARALLELES. < < < ARGUMENTS : < XS,YS = COORDONNEES DU POINT SCRATCH, < < < RESULTAT : < A=NIVEAU DE GRIS DU POINT SCRATCH. < < SPAPS: EQU $ PSR B,X,Y LX XS < X=ABSCISSE, LY YS < Y=ORDONNEE. LR X,A LBI 0 XWOR%1: VAL NBITMO=0 SCLD NBITMO-XWOR%1 < B=NUMERO DU MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < X=DECALAGE D'ACCES AUX BITS, PSR X XR Y,B SLLD NMOTL=0+NBITMO ORR Y,A < A=NUMERO DU MOT DANS LA TRAME. AD XCTCDA < POUR PERMETTRE UN ACCES A TV1/TV2... LRM B,X,Y WORD MCDAR WORD 1 WORD LIMAG < Y=LONGUEUR EN MOTS D'UNE TRAME. RCDA < ACCES A UN MOT ROUGE, LRM B,X WORD MCDAV WORD 1 ADR Y,A RCDA < ACCES A UN MOT VERT, LRM B,X WORD MCDAB WORD 1 ADR Y,A RCDA < ACCES A UN MOT BLEU. PLR X < RESTAURATION DU DECALAGE, LA MCDAR SLRS 0,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, LA MCDAV SLRS 0,X SLRD BIT < RECUPERATION D'UN BIT VERT, LA MCDAB SLRS 0,X ANDI BIT < RECUPERATION D'UN BIT BLEU, SLLD NCOOL-BIT < A=NIVEAU DE GRIS DU POINT. PLR B,X,Y RSR PAGE < < < R A N G E M E N T D ' U N P O I N T R E S I D E N T : < < < FONCTION : < CE SOUS-PROGRAMME RANGE LE < NIVEAU D'UN POINT SUR 3 BITS < PARALLELES. < < < ARGUMENTS : < XR,YR = COORDONNEES DU POINT, < A = SON NIVEAU DE GRIS. < < SPSPR: EQU $ PSR A,B,X,Y LX XR < X=ABSCISSE, LY YR < Y=ORDONNEE. PSR A LR X,A LBI 0 XWOR%1: VAL NBITMO=0 SCLD NBITMO-XWOR%1 SLRS NBITMO-XWOR%1 LR A,X < X=NUMERO DE BITS. XR Y,B SLLD NMOTL=0 ORR B,Y < Y=NUMERO DU MOT DANS LA TRAME. PLR A < A=NIVEAU DE GRIS DU POINT. SLRD NCOOL < ET MISE DANS B... XR X,Y LA &AIMAGR < ACCES A UN MOT ROUGE, STA SAVER LA &AIMAGV < ACCES A UN MOT VERT, STA SAVEV LA &AIMAGB < ACCES A UN MOT BLEU. XR X,Y SCLS 0,X SLLD BIT < RECUPERATION DU BIT BLEU, SCRS BIT,X STA SAVEB LA SAVEV SCLS 0,X SLLD BIT < RECUPERATION DU BIT VERT, SCRS BIT,X STA SAVEV LA SAVER SCLS 0,X SLLD BIT < RECUPERATION DU BIT ROUGE, SCRS BIT,X XR X,Y STA &AIMAGR < RANGEMENT DU MOT ROUGE, LA SAVEV STA &AIMAGV < RANGEMENT DU MOT VERT, LA SAVEB STA &AIMAGB < RANGEMENT DU MOT BLEU. PLR A,B,X,Y RSR PAGE < < < R A N G E M E N T D ' U N P O I N T S C R A T C H : < < < FONCTION : < CE SOUS-PROGRAMME RANGE LE < NIVEAU D'UN POINT SUR 3 BITS < PARALLELES EN SCRATCH. < < < AGUMENTS : < XS,YS = COORDONNEES DU POINT, < A = SON NIVEAU DE GRIS. < < SPSPS: EQU $ PSR A,B,X,Y PSR A < SAUVEGARDE DU NIVEAU, LX XS < DU POINT LY YS < SCRATCH (XS,YS). LR X,A LBI 0 XWOR%1: VAL NBITMO=0 SCLD NBITMO-XWOR%1 SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < X=AMPLITUDE DU DECALAGE... PSR X XR Y,B SLLD NMOTL=0+NBITMO ORR Y,A < A=ADRESSE DU MOT ROUGE CONTENANT < (XS,YS) DANS LA 'CDA'... AD XCTCDA < POUR ATTEINDRE TV1/TV2... LRM B,X,Y WORD MCDAR WORD 1 WORD LIMAG < Y=POUR PASSER D'UNE COULEUR A L'AUTRE. RCDA < ACCES AU MOT ROUGE, LRM B,X WORD MCDAV WORD 1 ADR Y,A RCDA < ACCES AU MOT VERT, LRM B,X WORD MCDAB WORD 1 ADR Y,A RCDA < ACCES AU MOT BLEU. PLR X < X=AMPLITUDE DU DECALAGE, STA WORK1 < SAUVEGARDE DE LA DERNIERE ADRESSE... PLR A < A=NIVEAU DE GRIS DE (XS,YS). SLRD NCOOL < ET CADRAGE DANS 'B'... LA MCDAB < MSE A JOUR DU BLEU, SCRS 0,X SLRS BIT SLLD BIT SCLS 0,X STA MCDAB LA MCDAV < MISE A JOUR DU VERT, SCRS 0,X SLRS BIT SLLD BIT SCLS 0,X STA MCDAV LA MCDAR < MISE A JOUR DU ROUGE. SCRS 0,X SLRS BIT SLLD BIT SCLS 0,X STA MCDAR LA WORK1 < A=ADRESSE EN 'CDA' DU BLEU... LRM B,X WORD MCDAB WORD 1 WCDA < MISE A JOUR DU BLEU, LRM B,X WORD MCDAV WORD 1 SBR Y,A WCDA < MISE A JOUR DU VERT, LRM B,X WORD MCDAR WORD 1 SBR Y,A WCDA < MISE A JOUR DU ROUGE. PLR A,B,X,Y RSR PAGE < < < C A L C U L D Y N A M I Q U E D U F A C T E U R < D ' E C H E L L E : < < < FONCTION : < LORSQUE IFECH=-1, POUR CHAQUE < POINT M(C(N)) DU CONTOUR C(N), ON < CONNAIT DEJA LE VECTEUR (M(C(N)),M(C(0))), < QUI REPRESENTE LA PLUS COURTE DISTANCE < DU POINT M(C(N)) AU CONTOUR C(0) ; ALORS < ON RECHERCHE LE POINT MP(C(0)), TEL QUE < LE VECTEUR (M(C(N)),MP(C(0))) SOIT OPPOSE < AU VECTEUR PRECEDENT, ET DE LONGUEUR < MINIMALE ; LE RAPPORT DES LONGUEURS DE < CES 2 VECTEURS PERMET DE FIXER DYNAMIQUE- < MENT LE CADRE... < < KFECH: EQU $ CPZ IFECH < ALORS ??? JGE KFECH1 < RIEN DE COMPLIQUE... < < CALCUL DE L'ECHELLE DYNAMIQUE POUR CHAQUE POINT DE C(N) : < FST RLXY0 < LONGUEUR MINIMALE RECONTREE. STZ XN0 < INITIALISATION DE LA SOMME VECTORIELLE STZ YN0 < DES LONGUEURS MINIMALES... SETV57: EQU $ LY APILEM PULL < RECUPERATION D'UN POINT MINI... JV SETV58 < C'EST FINI... SETV60: EQU $ ADRI -LVOIS,A LXI NVOIS < X=NOMBRE DE POINTS DE L'INTERVALLE... SETV61: EQU $ PSR A < SAVE LE NUMERO DU POINT COURANT, BSR ASPNUM < QUE L'ON TRANSFORME EN UN BON NUMERO < SUR C(0)... BSR AGZBL < OK, (B,A)=COORDONNEES (X,Y), SB SAVEY AD YN0 STA YN0 < CUMUL DE Y(M(C(N)),M(C(0))), LR B,A SB SAVEX AD XN0 STA XN0 < ET DE X(M(C(N)),M(C(0))). PLR A ADRI 1,A < NUMERO DU POINT SUIVANT... JDX SETV61 < S'IL EXISTE... JMP SETV57 < AU VECTEUR MINI SUIVANT... SETV58: EQU $ LA XN0 OR YN0 < LA SOMME VECTORIELLE EST-ELLE NULLE ??? JANE SETV59 < NON, OK... IC PILEM < OUI, DONC SUREMENT 2 VECTEURS OPPOSES, JMP SETV57 < ON VA REPRENDRE UNIQUEMENT LE PREMIER... < (LE 2EME CORRESPONDRA A LA DIRECTION < OPPOSEE...) KFECH1: EQU $ FMP FECH JMP KFECH2 < ON EST DANS LE CAS OU IFECH>-1... SETV59: EQU $ LA XN0 FLT FDV ANVOIS FST XN0 < CALCUL DE LA SOMME VECTORIELLE < NORMALISEE PAR RAPPORT A 'RLXY0'. FMP XN0 FST FWORK LA YN0 FLT FDV ANVOIS FST YN0 < MOYENNE VECTORIELLE... FMP YN0 FAD FWORK BSR ARAC FST FWORK3 < ET SON MODULE... FLD XN0 FDV FWORK3 FMP RLXY0 FST XN0 FLD YN0 FDV FWORK3 FMP RLXY0 FST YN0 FLD FMAX FST RLXY0S < INITIALISATION DE 'RLXY0S' SUR SA PLUS < GRANDE VALEUR (C'EST-A-DIRE LA DIAGONALE < DE L'IMAGE). FLD FEPS0 FST FEPS < INITIALISATION DE 'FEPS'... SETV53: EQU $ < < BOUCLE DE PARCOUR DE C(0) : < LAI 0 < A=NUMERO DU POINT COURANT DE C(0)... SETV50: EQU $ PSR A < SAUVEGARDE DU NUMERO DE POINT DE C(0). BSR ASPL BSR ARAC < (A,B)=DISTANCE DU POINT (SAVEX,SAVEY) < AU POINT COURANT DE C(0) : FST RLXY0P < MODULE(M(C(N)),MP(C(0))). FMP RLXY0 < *MODULE(M(C(N)),M(C(0))). FST FWORK3 < CE QUI DONNE LE PRODUIT DES MODULES... FLD XN0 FMP FWORK1 FST FWORK FLD YN0 FMP FWORK2 FAD FWORK < CE QUI DONNE LE PRODUIT SCALAIRE DU < PLUS PETIT VECTEUR DU POINT COURANT < DE C(N) A C(0) ET DU VECTEUR DU POINT < COURANT DE C(N) AU POINT COURANT DE C(0). FDV FWORK3 < CE QUI DONNE LE COSINUS DES CES 2 < VECTEURS... FCAM FEPS < OU EST-ON ??? JGE SETV51 < TANT QU'ON EST PAS ASSEZ EN FACE, < ON IGNORE... FLD RLXY0P FCAM RLXY0S < CORRESPOND-IL A UNE LONGUEUR MINI ??? JGE SETV51 < NON... FST RLXY0S < OUI, ON LA MEMORISE... LA SXY STA MXYS < AINSI QUE LE NUMERO DU POINT MP(C(0)). SETV51: EQU $ PLR A ADRI 1,A < PASSAGE AU POINT SUIVANT DE C(0), CP NPC0 JL SETV50 < QUI EXISTE... < < NOTA : ON DISPOSE MAINTENANT DE LA PLUS < PETITE LONGUEUR DU POINT COURANT DE C(N) < A C(0), ET DE LA PLUS PETITE LONGUEUR < DANS LA DIRECTION OPPOSEE : < FLD RLXY0S FCAM FMAX < A-T'ON TROUVE 'RLXY0S' ??? JL SETV52 < OUI, OK... FLD FEPS < NON, IL FAUT AUGMENTER LA FENETRE FAD F005 < DE TEST DES COSINUS... FST FEPS JMP SETV53 < ET UN NOUVEAU TOUR... SETV52: EQU $ FAD RLXY0 FST FWORK LRM A,B FLOAT <NMOTL*NBITMO?NLIG<0<0 FMP RLXY0 FDV FWORK < 256*RLXY0/(RLXY0+RLXY0S)... FMP FK < < CALCUL DU CADRE : < KFECH2: EQU $ FIX RSR PAGE < < < A R R O N D I F L O T T A N T : < < ROND: EQU $ JAL ROND1 < NOMBRE NEGATIF... FAD F05 < NOMBRE POSITIF... JMP ROND2 ROND1: EQU $ FSB F05 ROND2: EQU $ FIX RSR PAGE < < < O P E R A T I O N I N T E R - I M A G E S : < < < FONCTION : < CETTE VERSION PROVISOIRE REALISE < L'OPERATION .OP. DE LA FACON < SUIVANTE : < RESIDENT <-- (RESIDENT).OP.(SCRATCH) < CETTE OPERATION N'ETANT EFFECTUEE < QUE POUR LES BITS A 1 DU MASQUE... < < SPOP: EQU $ PSR A,B,X,Y LY ORGY STY YS < ORDONNEE SCRATCH. LYI 0 < Y=ORDONNEE. STY YR SPOP1: EQU $ LXI 0 STX XR < X=ABSCISSE. LX ORGX STX XS SPOP2: EQU $ LX XS LY YS PSR X,Y < SAUVEGARDE DE 'XS' ET 'YS'... LA XS CPZ MODX < EST-ON SUR UN X-TORE ??? JE SPOP3 < OUI... JAL SPOP5 < NON, ET XS EST OVERSCREEN... CPI NPOLM1 JG SPOP5 < DE MEME... JMP SPOP4 < OK, XS EST DANS L'ECRAN... SPOP3: EQU $ < CAS OU L'ON EST SUR UN X-TORE : ANDI NPOLM1 STA XS < CALCUL MODULO DE XS... SPOP4: EQU $ LA YS CPZ MODY < EST-ON SUR UN Y-TORE ??? JE SPOP6 < OUI... JAL SPOP5 < NON, ET YS EST OVERSCREEN... CPI NLIGM1 JG SPOP5 < DE MEME... JMP SPOP7 SPOP6: EQU $ < CAS OU L'ON EST SUR UN Y-TORE : ANDI NLIGM1 STA YS < CALCUL MODULO DE YS... SPOP7: EQU $ CPZ IMASKO JE SPOP8 < LE MASQUE EST OFF... PSR X,Y LX XR < X=COORDONNEE RESIDENTE, LY YR < AINSI QUE Y... LR X,A LBI 0 XWOR%1: VAL NBITMO=0 SCLD NBITMO-XWOR%1 < B=NUMERO DU MOT SUR LA LIGNE, SLRS NBITMO-XWOR%1 < A=NUMERO DU BIT DANS LE MOT, LR A,X < X=NUMERO DU BIT DANS LE MOT, XR Y,B SLLD NMOTL=0+NBITMO ORR A,Y < Y=NUMERO DU MOT DANS LE MASQUE, LRM A WORD AMASK ADR Y,A < A=ADRESSE DU MOT DANS LA 'CDA'. PSR X LRM B,X WORD MCDAM < B=ADRESSE DU MOT DE TRANSIT, WORD 1 < X=NOMBRE DE MOTS A DEPLACER. RCDA PLR X LA MCDAM < ACCES AU MASQUE, TBT 0,X < ALORS ??? PLR X,Y JNC SPOP5 < LE MOT (X,Y) EST MASQUE... SPOP8: EQU $ BSR ASP < EXECUTION DE L'OPERATION VARIABLE .OP. < SUR LE COUPLE DE POINTS (X,Y). SPOP5: EQU $ PLR X,Y < RESTAURATION DE XS ET YS... STX XS STY YS IC XS < PROGRESSION DE XS, IC XR < ET DE XR, LA XR CPI NPOLM1 < EST-ON EN BOUT DE LIGNE ??? JLE SPOP2 < NON... BALAYAGE HORIZONTAL... IC YS < OUI, PROGRESSION DE YS, IC YR < ET DE YR... LA YR CPI NLIGM1 < EST-ON EN BOUT D'IMAGE ??? JLE SPOP1 < NON, BALAYAGE VERTICAL... PLR A,B,X,Y RSR PAGE < < < O P E R A T I O N S I N T E R - I M A G E S : < < IMSAV: EQU $ < ENVOI DU RESIDENT EN SCRATCH. XLOAD: EQU $ BR AERROR < OUI, SUR LA 'CDA-IMAGE', ET ALORS < GARE AUX MOVE DE PLUS D'UN MOT !!! IMSAV1: EQU $ BSR ASPSCD BR ALOOP IMUP: EQU $ < RAPPEL DU SCRATCH EN RESIDENT AVEC MASK. LB ASPACD JMP IM2 IMLOAD: EQU XLOAD < RAPPEL DU SCRATCH EN RESIDENT SANS MASK. IM1: EQU $ IM2: EQU $ STB ASP < RELAI DYNAMIQUE DE SOUS-PROGRAMME. BSR ASPOP BR ALOOP PAGE < < < A C C E S A U C C I : < < GOCCI: EQU $ QUIT 1 < ACCES AU CCI INTERACTIF... BR ALOOP PAGE < < < E N T R E E D ' U N C A R A C T E R E : < < < ARGUMENT : < A=ADRESSE D'UN MESSAGE SI 'PIN'... < < < RESULTAT : < A=CARACTERE ENTRE. < < IF MODE-VISU,XWOR%7,,XWOR%7 PIN: EQU $ BSR APRINT XWOR%7: VAL 0 IN: EQU $ LAD DEMIN BSR AENTER LBY &AREP < A=CARACTERE REPONSE. RSR PAGE < < < E N T R E E D ' U N N O M B R E H E X A D E C I M A L < E T C O N V E R S I O N : < < < ARGUMENT : < A=ADRESSE D'UN MESSAGE SI 'PIHEX'... < < < RESULTAT : < VOIR 'HEX'... < < IF MODE-VISU,XWOR%7,,XWOR%7 PIHEX: EQU $ BSR APRINT XWOR%7: VAL 0 IHEX: EQU $ LAD DEMHEX BSR AENTER BSR AHEX < A=NOMBRE HEXADECIMAL, ET CODES CONDITION. RSR PAGE < < < E N T R E E D E L A C O N S T A N T E ' K ' < < INFK: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMK-ZERO XWOR%7: VAL 0 BSR AIFLOT < ENTREE DE FK... JLE INFK < 'K' DOIT ETRE STRICTEMENT POSITIVE... FST FK < OK... BR ALOOP PAGE < < < M I S E D E S I M A G E S E N M A T R I C E : < < CADRE: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMCAD-ZERO XWOR%7: VAL 0 BSR APIHEX < ENTREE DE A=NUMERO DU CADRE CHOISI, JNE CADRE < ERREUR !!! JAL CADRE < !???!! CPI XNIMA JGE CADRE < ?!??!?! LBI 0 XWOR%1: VAL -YNIMA SLRD YNIMA < A=NUMERO EN Y, ET B=NUMERO EN X... XWOR%2: VAL NLIGM1?NPOLM1+1>XWOR%1=0 SLLS XWOR%2 STA CADY < ORIGINE EN Y DU CADRE, SLLD XWOR%2+YNIMA STA CADX < ORIGINE EN X DU CADRE. CADRE4: EQU $ STZ IMAX < "N" A PRIORI... IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMMAX-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA REPONSE : CPI "N" JE CADRE5 < "N" : IMAX=0... IC IMAX < "O" : IMAX=1... CPI "O" JNE CADRE4 < ??!??!?!? CADRE5: EQU $ MOYEN5: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMNIVO-ZERO BSR APRINT < "NIVEAUX="... XWOR%7: VAL 0 BSR AIHEX < ENTREE DES NIVEAUX AUTORISES : JNE MOYEN5 < ERROR... STA LNIV < ET SAUVEGARDE A PRIORI... XWOR%8: VAL 0 DO NIVMAX+1*2 XWOR%8: VAL XWOR%8>BIT?BIT IF XWOR%8-'FFFF,,XWOR%, IF ATTENTION : MANQUE UNE VALIDATION DE IF DE CE QUI EST RENTRE... XWOR%: VAL 0 < < BOUCLE DE REDUCTION : < LXI 0 < X=COORDONNEE REDUITE X, CADRE1: EQU $ LYI 0 < Y=COORDONNEE REDUITE Y. CADRE2: EQU $ PSR X,Y LR X,A SLLS YNIMA LR A,X < X=COORDONNEE X REELLE, LR Y,A SLLS YNIMA LR A,Y < Y=COORDONNEE Y REELLE. STZ CADNIV < RAZ DU CUMUL DES NIVEAUX... STZ MAX DC MAX < INITIALISATION DU MAX A PRIORI... CADRE3: EQU $ STX XR STY YR BSR ASPGPR < A=NIVEAU(XR,YR), CP MAX < ALORS ??? JLE CADRE6 < (A)<=MAX... STA MAX < (A) DEVIENT LE NOUVEAU MAX... CADRE6: EQU $ AD CADNIV STA CADNIV < ET CUMUL... ADRI 1,X < PASSAGE AU POINT SUIVANT, LR X,A ANDI BIT>YNIMA-1 JANE CADRE3 < QUI EXISTE... XWOR%1: VAL BIT>YNIMA ADRI -XWOR%1,X < IL N'EXISTE PAS... ADRI 1,Y < ON CHANGE DE LIGNE, LR Y,A ANDI BIT>YNIMA-1 JANE CADRE3 < QUI EXISTE... PLR X,Y < RESTAURATION DES COORDONNEES REDUITES... PSR X,Y LA CADX ADR A,X < ET TRANSLATION DANS L'ESPACE REEL... STX XS LA CADY ADR A,Y STY YS LX LNIV < X=LISTE DES NIVEAUX A LAISSER INTACT : CPZR X < Y EN A-T'IL AU MOINS UN ??? JE CADRE8 < NON... BSR ASPGPS < OUI, A=NIVEAU(XS,YS) : XR A,X TBT 0,X < FAUT-IL LAISSER INTACT (XS,YS) ??? JC CADRE9 < OUI... CADRE8: EQU $ LA MAX < A=MAX A PRIORI... CPZ IMAX < MAX OU MOYENNE ??? JNE CADRE7 < MAX... LA CADNIV < MOYENNE... ADRI XNIMA/ZNIMA,A SARD NBITMO DV CADN < A=NIVEAU MOYEN DU PAVE... CADRE7: EQU $ LX LNIV XR A,X TBT NIVMAX+1,X < A-T'ON LE DROIT DE MARQUER LE NIVEAU < QUE L'ON VIENT DE CALCULER ??? XR A,X JC CADRE9 < NON, ON L'IGNORE... BSR ASPRPS < OUI, ON LE FORCE EN (XS,YS)... CADRE9: EQU $ PLR X,Y < RESTAURATION DES COORDONNEES REDUITES... ADRI 1,Y LR Y,A XWOR%1: VAL -YNIMA CPI NLIGM1>XWOR%1 JLE CADRE2 < PASSAGE A LA LIGNE SUIVANTE... ADRI 1,X LR X,A CPI NPOLM1>XWOR%1 JLE CADRE1 < PASSAGE AU POINT SUIVANT... BR ALOOP < ET C'EST FINI... PAGE < < < E N T R E E D E ' O R G X ' E T ' O R G Y ' : < < GORGX: EQU $ STZ MODX < TORE A PRIORI... IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMORGX-ZERO XWOR%7: VAL 0 BSR APIHEX < ENTREE DE ORGX... JE GORGX1 < OK... GORGX2: EQU $ BR AERROR < ET NON... GORGX1: EQU $ NGR A,A STA ORGX GORGX3: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMTORE-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA REPONSE... CPI "O" JE GORGX4 < TORE... CPI "N" JNE GORGX3 < ERREUR... IC MODX < CE N'EST PAS LE MODE TORE... GORGX4: EQU $ BR ALOOP < OK... GORGY: EQU $ STZ MODY < MODE TORE A PRIORI... IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMORGY-ZERO XWOR%7: VAL 0 BSR APIHEX < ENTREE DE ORGY... JNE GORGX2 < ERREUR... NGR A,A STA ORGY GORGY3: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMTORE-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA REPONSE... CPI "O" JE GORGY4 < TORE... CPI "N" JNE GORGY3 < ERREUR... IC MODY < CE N'EST PAS LE MODE TORE... GORGY4: EQU $ BR ALOOP < OK... PAGE < < < E N T R E E D E ( C X , C Y ) E T ( I X , I Y ) : < E T D U P A S : < < CENTRE: EQU $ IF VERSIO-XXV2,XWOR%8,,XWOR%8 STZ IFECH < PAS D'ECHELLE DYNAMIQUE A PRIORI... CENTR8: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMOPTC-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA REPONSE O/N/A : STZ ICXCY < ICXCY=0 A PRIORI... CPI "O" JE CENTRA < OUI, ON UTILISERA (CX,CY)... IC ICXCY CPI "N" JE CENTRA < "N" : (CX,CY) NE SERA UTILISE QUE POUR < LES PREMIERS CONTOURS... CPI "A" < EST-CE LE MODE AUTOMATIQUE ??? JNE CENTR8 < ??!?!! STZ ICXCY DC ICXCY < ICXCY=-1 (<0) : MODE AUTOMATIQUE... STZ IFECH IC IFECH < ET ALORS LE MODE 'ECHELLE DYNAMIQUE' < EST IMPLICITE... IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMECH-ZERO BSR APRINT < CE QUE L'ON DIT... XWOR%7: VAL 0 JMP CENTR2 < ET L'ON SAUTE L'ENTREE DE (CX,CY)... CENTRA: EQU $ XWOR%8: VAL 0 CENTR9: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMCX-ZERO XWOR%7: VAL 0 BSR APIHEX JNE CENTR9 JAL CENTR9 < ERREUR... CPI NPOLM1 JG CENTR9 < ERREUR... IF VERSIO-XXV1,XWOR%8,,XWOR%8 STA CX XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 FLT FAD F05 < AFIN QUE (CX,CY) N'APPARTIENNE A < AUCUN CONTOUR... FST CX XWOR%8: VAL 0 CENTR1: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMCY-ZERO XWOR%7: VAL 0 BSR APIHEX JNE CENTR1 JAL CENTR1 < ERREUR... CPI NLIGM1 JG CENTR1 < ERREUR... IF VERSIO-XXV1,XWOR%8,,XWOR%8 STA CY XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 FLT FAD F05 < AFIN QUE (CX,CY) N'APPARTIENNE A < AUCUN CONTOUR... FST CY XWOR%8: VAL 0 CENTR2: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMIX-ZERO XWOR%7: VAL 0 BSR APIHEX JNE CENTR2 JAL CENTR2 < ERREUR... CPI NPOLM1 JG CENTR2 < ERREUR... STA IX CENTR3: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMIY-ZERO XWOR%7: VAL 0 BSR APIHEX JNE CENTR3 JAL CENTR3 < ERREUR... CPI NLIGM1 JG CENTR3 < ERREUR... STA IY IF VERSIO-XXV2,XWOR%8,,XWOR%8 CENTR4: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMPAS-ZERO XWOR%7: VAL 0 BSR APIHEX < ENTREE DU PAS : JNE CENTR4 < ERREUR... JAL CENTR4 < ERREUR... CPI XPAS JG CENTR4 < ERREUR... STA PAS JANE CENTR7 < CAS OU PAS#0... < < CAS PAS=0 : VOYONS POUR L'ECHELLE DYNAMIQUE : < CPZ ICXCY < EST-CE LE MODE (CX,CY) AUTOMATIQUE ??? JL CENTRC < OUI, L'ECHELLE DYNAMIQUE EST IMPLICITE... CENTRB: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMECH-ZERO XWOR%7: VAL 0 BSR APIN < ENTREE DE LA REPONSE O/N : STZ IFECH < IFECH=0 : NON A PRIORI... CPI "N" JE CENTRC < NON, PAS D'ECHELLE DYNAMIQUE... IC IFECH CPI "O" JE CENTRC < "O" : IFECH=1... CPI "A" JNE CENTRB < ???!?!!! STZ IFECH DC IFECH < "A" : IFECH=-1... CENTRC: EQU $ CENTR7: EQU $ XWOR%8: VAL 0 CENTR5: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMSENS-ZERO XWOR%7: VAL 0 STZ SENS < 2 -->1 A PRIORI... BSR APIN < ENTREE DE LA REPONSE : CPI "<" JE CENTR6 IC SENS < 1 --> 2... CPI ">" JNE CENTR5 < ?!????! CENTR6: EQU $ BR ALOOP < ET C'EST TOUT... PAGE < < < M O U V E M E N T S R E S I D E N T <--> T V : < < DEMTV: WORD TVDKU < DEMANDE D'ENVOI D'UNE IMAGE DE 'TV' < EN MODE ENTRELACE ; CETTE DEMANDE EST < MISE ICI, ET NON PAS EN BAS, CAR IL < N'Y A PAS DE PLACE DANS LA RACINE DE < L'OVERLAY !!! WORD IMAGE-ZERO*NOCMO WORD LIMAG*NOCMO*NCOOL WORD 0 MOV0: EQU $ < RESIDENT R+V+B --> TV. LRM A WORD DEMTV JMP MOVX < VERS L'ENVOI DE L'IMAGE... MOV3: EQU $ < RESIDENT B --> TV. LAD DEMTVB MOVX: EQU $ SVC 0 < BLEU. BR ALOOP MOV1: EQU $ < RESIDENT R --> TV. LAD DEMTVR SVC 0 < ROUGE. BR ALOOP MOV2: EQU $ < RESIDENT V --> TV. LAD DEMTVV SVC 0 < VERT. BR ALOOP PMOV5: EQU $ < TV R --> RESIDENT. LA DEMTVR+3 LR A,B ORI TVIN < MISE EN ENTREE, STA DEMTVR+3 LAD DEMTVR SVC 0 < ENTREE DU ROUGE, STB DEMTVR+3 < ET RESTAURATION... RSR PMOV6: EQU $ < TV V --> RESIDENT. LA DEMTVV+3 LR A,B ORI TVIN STA DEMTVV+3 LAD DEMTVV SVC 0 < ENTREE DU VERT... STB DEMTVV+3 RSR PMOV7: EQU $ < TV B --> RESIDENT. LA DEMTVB+3 LR A,B ORI TVIN STA DEMTVB+3 LAD DEMTVB SVC 0 < ENTREE DU BLEU... STB DEMTVB+3 RSR MOV4: EQU $ < TV R+V+B --> RESIDENT. BSR APMOV5 < ROUGE, BSR APMOV6 < VERT, MOV7: EQU $ < TV B --> RESIDENT. BSR APMOV7 < BLEU. BR ALOOP MOV5: EQU $ < TV R --> RESIDENT. BSR APMOV5 BR ALOOP MOV6: EQU $ < TV V --> RESIDENT. BSR APMOV6 BR ALOOP PAGE < < < A C C E S A T V 2 : < < STV2: EQU $ LRM A,B,X WORD TV2 WORD IMAGE WORD LIMAG*NCOOL WCDA BR ALOOP GTV2: EQU $ LRM A,B,X WORD TV2 WORD IMAGE WORD LIMAG*NCOOL RCDA BR ALOOP PAGE < < < T R A N S F E R T S R E S I D E N T - S C R A T C H : < < < FONCTION : < CE MODULE ASSURE LES TRANSFERTS < BRUTAUX ENTRE LE RESIDENT, ET LE < SCRATCH (QUI EST EN FAIT LA 'CDA'). < < SPSCD: EQU $ PSR A,B,X LRM A,B,X WORD 0 < A=ADRESSE EN 'CDA', WORD IMAGE < B=ADRESSE EN RESIDENT, WORD LIMAG*NCOOL < X=NOMBRE DE MOTS A TRANSFERER. WCDA < TRANSFERT : RESIDENT --> SCRATCH. PLR A,B,X RSR SPACD: EQU $ < TRANSFERT AVEC MASQUE... PSR A BSR ASPGPS < ACCES AU POINT SCRATCH COURANT, BSR ASPRPR < ET MISE EN RESIDENT... PLR A RSR SPBCD: EQU $ < TRANSFERT SANS MASQUE... PSR A,B,X LRM A,B,X WORD 0 < A=ADRESSE EN 'CDA', WORD IMAGE < B=ADRESSE EN RESIDENT, WORD LIMAG*NCOOL < X=NOMBRE DE MOTS A TRANSFERER. RCDA < TRANSFERT : SCRATCH --> RESIDENT. PLR A,B,X RSR PAGE < < < B R A N C H E D ' O V E R L A Y : < < DEBOV1: EQU $ XWOR%1: VAL DEBOV1-ZERO*NOCMO OVLTZ2: EQU ZERO+XWOR%1 < ADRESSE-OCTET DE LA BRANCHE... BYTE " ";NOMBB ASCI " " BYTE '04;'D0 XWOR%1: VAL ITEM2-ZERO IF $-ZERO-XWOR%1,XWOR%,, IF ATTENTION : LA RACINE DE L'OVERLAY EST TROP LONGUE !!! XWOR%: VAL 0 < < VALIDATION DU FORMAT DE L'IMAGE (CARREE) : < X20: VAL 1024/DY < NBRE DE LIGNES/IMAGE. X21: VAL CNMPL*16 < NBRE DE POINTS/LIGNE. IF X20-X21,,X100, IF ATTENTION : L'IMAGE N'EST PAS CARREE !!! X100: VAL 0 PAGE < < < L O C A L : < < LOCAL LOC: EQU $ < < MESSAGES : < M1: BYTE 9;'6D ASCI "ERR.DEP!" M2: BYTE 5;'6D ASCI "OPEN" M3: BYTE 7;'6D ASCI "P.ISOL" M4: BYTE 5;'6D ASCI "INT." M5: BYTE 5;'6D ASCI "EXT." CURSOR: BYTE "N";0 < CARACTERE DE DEBLOCAGE DU < CURSEUR (ERREUR A PRIORI). DZS 2 < COORDONNEES Y ET X. < < DEMANDES A CMS4 : < IF MODE-VISU,XWOR%7,,XWOR%7 OG: WORD '0103 < OPEN GRAPHIQUE DE '01. CU: WORD '0106 < MISE EN FONCTION DU CURSEUR WORD 0 < GRAPHIQUE DE '01 (AMDEM=0). LCU: WORD '0109 < LECTURE CURSEUR GRAPHIQUE WORD CURSOR-ZERO*2 < DE '01. WORD 6 CG: WORD '0104 < CLOSE GRAPHIQUE DE '01. XWOR%7: VAL 0 STABIL: WORD '8A01 < DEMANDE DE STABILISATION VIDEO. WORD IMAG-ZERO*2 WORD LIMAG*2 WORD TVPR < SUR LE PROCESSEUR ROUGE. < < CONSTANTES : < FIRST: WORD 0 < POUR DETECTER LE PREMIER CUMUL < DES CONTOURS... ALIMAG: WORD LIMAG < NBRE DE MOTS DE L'IMAGE. NMPL: WORD CNMPL < NBRE MOTS DE 16 BITS PAR LIGNE. NLIN: WORD 1024/DY-1 < NBRE DE LIGNES/IMAGE-1. NPPL: WORD CNMPL*16-1 < NBRE DE POINTS/LIGNE-1. YMIN: WORD 0 < DERNIERE LIGNE A TESTER LORS < DES BALAYAGES DE L'IMAGE < POUR ELIMINER LES POINTS < 0-ISOLES ET 1-ISOLES. YMAX: WORD 0 < DE MEME : PREMIERE LIGNE... ITEST: WORD 1 < 0 : TEST SUR LA VALEUR 0 DES POINTS, < 1 : TEST SUR VALEUR 1 DES POINTS. X: VAL 1 < COORDONNEE X D'UN POINT. Y: VAL 0 < COORDONNEE Y D'UN POINT. DEP: WORD 0;0 < POINT DE DEPART D'UN CONTOUR. PTC: WORD 0;0 < POINT COURANT LORS D'UN PARCOURS. SUC: WORD 0;0 < SUCCESSEUR DU POINT COURANT (X,Y). NREMPL: WORD 0 < NOMBRE DE REMPLACANTS ATTEN- < DUS POUR LE POINT COURANT. REMP: WORD 0;0 < FUTUR REMPLACANT DU POINT < COURANT SUR LE CONTOUR LORS DE < SON PARCOURS. NPILR: WORD 0 < NBRE DE POINTS A DEPILER < DE LA PILE 'PILR'. APILR: WORD 0 < REALI COURANT VERS PILR. PILR: DZS 4*2 < POUR EMPILER M1, M2, M3, PTC. SDEP: WORD 0;0 < POINT DE DEPART POUR LE TOUR < SUIVANT (FUTUR 'DEP'). POINT1: WORD 0;0 < CONTIENT UN POINT QUE L'ON SAIT < SAIT ETRE A 1 LORS DE LA < RECHERCHE DES VOISINS. VX: WORD 1 < COORDONNEES X ET Y DU VY: WORD 0 < VECTEUR DEPLACEMENT. SVX: WORD 0 < SAVE VX. SVY: WORD 0 < SAVE VY. KOMPT: WORD 0 < COMPTEUR DES POINTS MIS A 1, < LORS D'UN PARCOURS DE REM- < PLISSAGE. PKOMPT: WORD -1 < KOMPT DU TOUR PRECEDENT. OSCIL: WORD 0 < COMPTEUR DES OSCILLATIONS. MOSCIL: WORD 8 < MAX DE OSCIL... KDIFF: WORD 0 < COMPTAGE DES DIFFERENCES ENTRE < L'IMAGE AVANT ET APRES L'AJOUT < DU NOUVEAU CONTOUR INTERNE. DOUBLE: WORD 0 < COMPTEUR DES POINTS DOUBLES < D'UN PARCOURS. NISOL: WORD 0 < NOMBRE DE POINTS ISOLES, < OU SIMPLEMENT RATTACHES < RECONTRES AVANT CHAQUE < PARCOURS. INDIC: WORD 0 < RESULTAT (0/1) DES TESTS < VIRTUELS. ANGLE: WORD 0 < SOMMATION DES ROTATIONS < PARTIELLES 'ROT1' ET 'ROT3' : < +1 : +PI/2 (ROT1), < -1 : -PI/2 (ROT3). SANGLE: WORD 0 < SAUVEGARDE TEMPORAIRE DE < L'ANGLE COURANT LORS DES < RECHERCHES DE VOISINS. PREM: WORD 1 < 1 : 1ER POINT DE L'IMAGE < NON ENCORE RENCONTRE, < 0 SINON. < < RELAIS DIVERS : < AIMAG0: WORD 0 < RELAI VARIABLE... AIMAG1: EQU AIMAGR < ACCES A L'IMAGE VIDEO COURANTE. AIMAG: WORD IMAG-1,X < RELAI DE RAZ IMAGE COURANTE. AARG: WORD ARG < PREPARATION DES ARGUMENTS DES SOUS- < PROGRAMMES SET, RESET,... ASET: WORD SET < MISE D'UN POINT A 1. ARESET: WORD RESET < MISE D'UN POINT A 0. AINVER: WORD INVER < INVERSION D'UN POINT. ACLIGN: WORD CLIGN < CLIGNOTEMENT DES POINTS VIDEO. ATEST: WORD TEST < TEST DE L'ETAT D'UN POINT. ASETV: WORD SETV < MISE D'UN POINT VIRTUEL A 1. ASETV5: WORD SETV5 < RELAI... ASETV6: WORD SETV6 < RELAI... AT0: WORD T0 < TEST DE (A,B)=0.0... ARSETV: WORD RSETV < MISE D'UN POINT VIRTUEL A 0. AINVEV: WORD INVEV < INVERSION D'UN POINT VIRTUEL. ATESTV: WORD TESTV < TEST D'UN POINT VIRTUEL. AXISTV: WORD XISTV < EXISTENCE VIRTUELLE... APS: WORD PS < SBT. APR: WORD PR < RBT. API: WORD PI < IBT. APT: WORD PT < TBT. AOP: WORD 0 < PS/PR/PI/PT SUIVANT LES BESOINS. AEXIST: WORD EXIST < EXISTENCE D'UN POINT. AVOISI: WORD VOISI < TEST ET COMPTAGE D'UN VOISIN. AI2: WORD ITEM2-1,X < RELAI DE RAZ ITEM1+ITEM2. ACONT8: WORD CONT18 < RELAI VERS 'CONT18'... ACOORD: WORD COORD < ENTREE COORDONNE X/Y. AMOV: WORD MOV < DEPLACEMENT PAR (VX,VY). AROT1: WORD ROT1 < ROTATION DE +PI/2. AROT3: WORD ROT3 < ROTATION DE -PI/2. ASAVDP: WORD SAVDEP < SAUVEGARDE DU SUCCESSEUR DU < POINT COURANT. AREMPL: WORD REMPL < SAUVEGARDE D'UN REMPLACANT < POSSIBLE DU POINT COURANT. ASPILR: WORD SPILR < RANGEMENT DE (X,Y) DANS PILR. ASUCC: WORD SUCC < RECHERCHE D'UN SUCCESSEUR < POSSIBLE DU POINT COURANT. ACONTI: WORD CONTI < RETOUR DE LA ZONE SCRATCH < EN MEMOIRE. ARAZDK: WORD RAZDK < RAZ DE LA ZONE SCRATCH DK. PAGE PROG PAGE < < < E N T R E E D ' U N E C O N S T A N T E F L O T T A N T E : < < < ARGUMENT : < A=ADRESSE D'UN MESSAGE EN MODE 'VISU'. < < < RESULTAT : < A,B=CONSTANTE FLOTTANTE. < INDICATEURS POSITIONNES PAR 'FCAZ'. < < IFLOT: EQU $ PSR X,Y IF MODE-VISU,XWOR%7,,XWOR%7 LR A,X < X=SAUVEGARDE DE L'ADRESSE MESSAGE. IFLOT1: EQU $ LR X,A < A=ADRESSE DU MESSAGE A EDITER... XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 IFLOT1: EQU $ XWOR%7: VAL 0 BSR APIHEX < ENTREE DU NUMERATEUR, JNE IFLOT1 < ERREUR... LR A,Y < Y=NUMERATEUR. IF MODE-VISU,XWOR%7,,XWOR%7 LAI AMSLAS-ZERO XWOR%7: VAL 0 BSR APIHEX < ENTREE DU DENOMINATEUR, JNE IFLOT1 < ERREUR... JAE IFLOT1 < IL NE PEUT ETRE NUL !!! FLT FST FWORK < DENOMINATEUR, LR Y,A FLT < NUMERATEUR, FDV FWORK < RESULTAT=NUMERATEUR/DENOMINATEUR. FCAZ < ???? PLR X,Y RSR PAGE < < < R O T A T I O N D E ( VX , VY ) : < < < FONCTION : < CES 2 ROUTINES MULTIPLIENT LE NBRE < COMPLEXE (VX,VY) PAR LES NOMBRES < COMPLEXES I=(0,1) ET -I=(0,-1) < RESPECTIVEMENT. < < ROT1: EQU $ IC ANGLE < ROTATION DE +PI/2. PSR A,B LA VX LB VY NGR B,B ROT: EQU $ STB VX STA VY PLR A,B RSR ROT3: EQU $ DC ANGLE < ROTATION DE -PI/2. PSR A,B LA VX LB VY NGR A,A JMP ROT < VERS VX<--(B), VY<--(A). < < < D E P L A C E M E N T D U P O I N T C O U R A N T : < < < FONCTION : < CETTE ROUTINE DEPLACE LE POINT < COURANT (X,Y) A L'AIDE DU VECTEUR < DEPLACEMENT (VX,VY). < < < ARGUMENT : < X ET Y = L'X ET L'Y DU POINT. < < MOV: EQU $ PSR A,B LA VX LB VY ADR A,X < X <-- X+VX. ADR B,Y < Y <-- Y+VY. PLR A,B RSR PAGE < < < S A U V E G A R D E D U D E P L A C E M E N T < F U T U R : < < < FONCTION : < CETTE ROUTINE SAUVEGARDE LE POINT < (X,Y) EN TANT QUE FUTUR DEPLACEMENT, < LE VECTEUR (VX,VY), FAIT UN RETOUR AU < POINT COURANT PTC, ET INITIALISE < UN COMPTEUR DE REMPLACANTS (B). < < < ARGUMENT : < X,Y = POINT FUTUR. < A=NBRE DE REMPLACANTS ATTENDUS POUR LE PTC. < < < RESULTAT : < B=0. < < SAVDEP: EQU $ STA NREMPL < NOMBRE DE REMPLACANTS < ATTENDUS POUR LE POINT COURANT. STX SUC+X < SAUVEGARDE DU SUCCESEUR STY SUC+Y < DU POINT COURANT. LA VX STA SVX < SAUVEGARDE DU VECTEUR LA VY < DEPLACEMENT MENANT AU STA SVY < SUCCESSEUR 'SUC'. LX PTC+X < ET RETOUR AU POINT LY PTC+Y < COURANT. LBI 0 < INITIALISATION DU COMPTEUR. RSR < < < M A R Q U A G E D ' U N R E M P L A C A N T < A G A U C H E : < < < FONCTION : < CETTE ROUTINE REGARDE A GAUCHE < DU POINT (X,Y) ARGUMENT (SUIVANT < LE SENS DU VECTEUR (VX,VY)); SI < LE POINT AINSI VU EST A 0, IL EST < MARQUE VIRTUELLEMENT A 1. < < < ARGUMENT : < X,Y = UN POINT. < < < RESULTAT : < B <-- (B)+1 SI UN REMPLACANT A ETE TROUVE, < DE MEME POUR 'KOMPT'. < < REMPL: EQU $ BSR AROT3 < ON REGARDE A GAUCHE, BSR AMOV < ET ON SE DEPLACE DANS CETTE < DIRECTION. STZ ITEST < POUR LA RECHERCHE DE POINTS A 0. BSR AXISTV < TEST VIRTUEL DU POINT VU < A GAUCHE. JANE REMPL1 < N'EXISTE PAS, OU EST A 1. < < CAS OU UN REMPLACANT A GAUCHE A ETE TROUVE : < BSR AEXIST < EST-IL A 1 SUR LE CONTOUR < COURANT ??? JANE REMPL2 < OUI, ON NE LE COMPTE DONC PAS !!! IC KOMPT < COMPTAGE GLOBAL (AU COURS < DE CE TOUR) DE CELUI-CI, REMPL2: EQU $ ADRI 1,B < ET COMPTAGE LOCAL (RELATIVE- < MENT AU POINT COURANT PTC). BSR ASPILR < EMPILEMENT DE (X,Y). STX REMP+X < ET ENFIN, ON LE SAUVEGARDE STY REMP+Y < NON RECURSIVEMENT. REMPL1: EQU $ RSR < < < E M P I L E M E N T D A N S P I L R : < < < ARGUMENT : < X,Y= POINT A EMPILER. < < SPILR: EQU $ STX &APILR IC APILR < PROGRESSION POINTEUR DE PILR. STY &APILR IC APILR < PROGRESSION POINTEUR DE PILR. RSR < < < R E C H E R C H E D ' U N S U C C E S S E U R < D E L A D R O I T E V E R S L A G A U C H E : < < < FONCTION : < CETTE ROUTINE TOURNE DE LA < DROITE VERS LA GAUCHE AUTOUR < DU POINT COURANT, ET TESTE < SI LE POINT AINSI VU EXISTE < ET EST A 1. < < SUCC: EQU $ LX PTC+X < ON SE REPLACE SUR LE LY PTC+Y < POINT COURANT PTC. BSR AROT3 < ROTATION VERS LA GAUCHE. BSR AMOV < ET DEPLACEMENT VERS LA < GAUCHE. STZ ITEST IC ITEST < POUR TESTER DES POINTS A 1. BSR AEXIST < TEST DU POINT VU A GAUCHE. RSR PAGE IF VERSIO-XXV2,XWOR%8,,XWOR%8 < < < N U M E R O D ' U N P O I N T S U R C ( 0 ) : < < < ARGUMENT : < A=NUMERO QUELCONQUE. < < < RESULTAT : < A=NUMERO CORRECT DANS L'INTERVALLE (0,NPC0-1). < < SPNUM: EQU $ DECXY:: VAL 8 < POUR DECONCATENER X ET Y... JAGE SETV25 AD NPC0 < CALCUL MODULO 'NPC0'... JMP SPNUM SETV25: EQU $ CP NPC0 JL SETV20 < OK... SB NPC0 < CALCUL MODULO 'NPC0'... JMP SPNUM SETV20: EQU $ < A=NUMERO D'UN POINT DE C(0) QUE L'ON < ASSOCIE AU POINT COURANT DE C(N), PAR < LA FORMULE : < P(C(0))=P(C(N))*N(C(0))/N(C(N)) CE QUI < EST PEU DIFFERENT DE : < #P(C(N))*N(C(0))/N(C(N-1)), OU < 'P' DESIGNE UN NUMERO DE POINT, ET 'N' < LE NOMBRE DE POINTS D'UN CONTOUR... RSR PAGE < < < C A L C U L D ' U N E L O N G U E U R : < < < FONCTION : < CE SOUS-PROGRAMME CALCULE LE CARRE < DE LA LONGUEUR SEPARANT UN POINT FIXE < (SAVEX,SAVEY) DE C(N) D'UN POINT < VARIABLE DE C(0). < < < ARGUMENT : < A=NUMERO DU POINT VARIABLE DE C(0). < < < RESULTAT : < A,B=CARRE DE LA LONGUEUR. < X,Y=COORDONNEES DU POINT DE NUMERO ARGUMENT. < FWORK1=X(M(C(0)))-X(M(C(N))), < FWORK2=Y(M(C(0)))-Y(M(C(N))). < < SPL: EQU $ BSR ASPNUM < A=NUMERO DU POINT SUR C(0)... STA SXY < SAUVEGARDE DU NUMERO DU POINT COURANT. BSR AGZBL < RECUPERATION DES COORDONNEES DU POINT < COURANT DE C(0). LR B,X LR A,Y SB SAVEY FLT FST FWORK2 < Y(C(0))-Y(C(N)). FMP FWORK2 FST FWORK LR X,A SB SAVEX FLT FST FWORK1 < X(C(0))-X(C(N)). FMP FWORK1 FAD FWORK RSR < < < C A L C U L D ' U N E L O N G U E U R < M I N I M A L E N O N N U L L E : < < SPLM: EQU $ BSR ASPL < CALCUL DE LA LONGUEUR DU POINT COURANT < DE C(N) AU POINT X0Y0+IXY DE C(0) : FCAZ JE SPLM31 < SI LA LONGUEUR EST NULLE, ON L'IGNORE... CPZ IFECH < MODE DE L'ECHELLE ??? JGE SPLM32 < STATIQUE... < < CAS DE L'ECHELLE DYNAMIQUE : < FCAM LXY < COMMENT EST LA LONGUEUR COURANTE ??? JG SPLM31 < PLUS GRANDE, SANS INTERET... JE SPLM33 < IDENTIQUE... FST LXY < MINIMALE, ON LA MEMORISE, LA PILEM0 < ET ON REINITIALISE STA PILEM < LA PILE DES POINTS MINIS... SPLM33: EQU $ LY APILEM LA SXY PUSH < EMPILEMENT DU NUMERO D'UN "POINT MINI"... JMP SPLM34 < < CAS DE L'ECHELLE STATIQUE : SPLM32: EQU $ FCAM LXY < LA LONGUEUR EST-ELLE MINIMALE ??? JGE SPLM31 < NON... FST LXY < OUI, ON LA GARDE... LA SXY SPLM34: EQU $ STA MXY < SAUVEGARDE DU NUMERO DU POINT COURANT < DE C(0)... SPLM31: EQU $ RSR < < < R E C U P E R A T I O N D E S C O O R D O N N E E S < D U P O I N T C O U R A N T D E C ( 0 ) : < < < ARGUMENT : < A=NUMERO DU POINT. < < < RESULTAT : < A=COORDONNEE Y, < B=COORDONNEE X. < < GZBL: EQU $ LYI YLOAD BSR AGZB LAI 0 SCRD DECXY < DECONCATENATION SLRS DECXY < DES COORDONNEES. RSR XWOR%8: VAL 0 PAGE < < < R O U T I N E D E C R E A T I O N < D ' I M A G E S V I R T U E L L E S : < < < ARGUMENT : < X=X DU POINT A TRAITER, < Y=Y DU POINT A TRAITER. < < < RESULTAT : < LE CARY EST POSITIONNE POUR 'TESTV', DE < PLUS, LE SECTEUR COURANT PEUT CHANGER... < < PS: EQU $ SBT 0,X RSR PR: EQU $ RBT 0,X RSR PI: EQU $ IBT 0,X RSR PT: EQU $ CPZ ITEST < TEST DU MODE 0/1 DE TEST. JNE PT1 < MODE 1. IBT 0,X < MODE 0. PT1: EQU $ TBT 0,X LAI 1 < A EST DESTRUCTIBLE !!! SBCR A < CALCUL DU RESULTAT, STA INDIC < ET TRANSMISSION A 'EXISTV'. RSR < < A C C E S I M A G E V I R T U E L L E : < SETV: EQU $ PSR B,X,Y,W LRM W WORD IMAGB < AFIN D'ATTEINDRE PAR 'EXIST' L'IMAGE < BLEUE DU CUMUL DES CONTOURS... LB ITEST < B=SAUVEGARDE DE 'ITEST', STZ ITEST IC ITEST < POUR TESTER LES POINTS A 1... BSR ATEST < TEST DU POINT (X,Y)... STB ITEST < ET RESTAURE 'ITEST'... JNC SETV4 < LE POINT (X,Y) EST NOIR, ON PEUT < L'EXPLOITER... PLR B,X,Y,W SETV55: EQU $ BR ASETV5 < LE POINT (X,Y) EST DEJA MARQUE < DANS LE CONTOUR BLEU, IL NE FAUT < DONC PAS LE REPRENDRE EN COMPTE ; < ON RESOUD DONC AINSI LE PROBLEME DU < SQUELETTE DE L'IMAGE QUI REPASSE < SUR DES CONTOURS ANTERIEURS... SETV4: EQU $ IF VERSIO-XXV2,XWOR%8,,XWOR%8 LA IC0 CPI XICXCY < EN EST-ON AUX PREMIERS CONTOURS ??? JLE SETV4Z < OUI, ON UTILISE (CX,CY)... CPZ ICXCY < NON, ALORS (CX,CY) SONT-ILS UTILES ??? JNE SETV4X < NON... SETV4Z: EQU $ XWOR%8: VAL 0 LR X,A IF VERSIO-XXV1,XWOR%8,,XWOR%8 SB CX FLT XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 FLT FSB CX XWOR%8: VAL 0 FST DELTAX < DISTANCE AU CENTRE POLAIRE CONTOUR. FMP DELTAX FST FWORK LR Y,A IF VERSIO-XXV1,XWOR%8,,XWOR%8 SB CY FLT XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 FLT FSB CY XWOR%8: VAL 0 FST DELTAY < DISTANCE AU CENTRE POLAIRE CONTOUR. FMP DELTAY FAD FWORK BSR ARAC FCAZ < L'HYPOTENUSE EST-ELLE NULLE (EST-ON < AU POINT (CX,CY) ??? JNE SETV7 < NON... LA IX STA XS < ON SE PLACE LA IY < AU CENTRE (IX,IY)... BR ASETV6 < ET ON VA CHERCHER SON NIVEAU... SETV7: EQU $ FST FWORK < DISTANCE EUCLIDIENNE DU POINT COURANT < (X,Y) AU CENTRE POLAIRE (CX,CY) DU < CONTOUR. FLD DELTAX FDV FWORK FST FIX < CE QUI DONNE UN INCREMENT EN X DE < PASSAGE D'UN POINT A UN AUTRE DANS < LE SENS DU VECTEUR (CX,CY) --> (X,Y). FLD DELTAY FDV FWORK FST FIY < DE MEME, INCREMENT EN Y... IF VERSIO-XXV1,XWOR%8,,XWOR%8 LR X,A FLT FST FX < COORDONNEE X, LR Y,A FLT FST FY < COORDONNEE Y. < < RECHERCHE DU PREMIER POINT NOIR < DANS LA DIRECTION DU VECTEUR < (CX,CY) --> (X,Y) : < LA ITEST PSR A < SAUVEGARDE DE 'ITEST' COURANT, STZ ITEST IC ITEST < ET MISE EN PLACE DES CONDITIONS DE < TEST NORMAL (1). SETV1: EQU $ FLD FX FAD FIX FST FX < INCREMENTATION DEX X, BSR AROND LR A,X FLD FY FAD FIY FST FY < ET DES Y... BSR AROND LR A,Y BSR AEXIST < TEST DU NOUVEAU POINT (X,Y) ??? JAE SETV1 < IL EST A 1, ON REBOUCLE... < < CAS D'UN POINT NOIR : ON DESIRE QU'IL < SOIT ISOLE, AFIN DE VRAIMENT SORTIR < DU CONTOUR CUMULE COURANT : < LBI 8 < IL A 8 VOISINS... ADRI 1,X BSR AEXIST SBR A,B ADRI -1,Y BSR AEXIST SBR A,B ADRI -1,X BSR AEXIST SBR A,B ADRI -1,X BSR AEXIST SBR A,B ADRI 1,Y BSR AEXIST SBR A,B ADRI 1,Y BSR AEXIST SBR A,B ADRI 1,X BSR AEXIST SBR A,B ADRI 1,X BSR AEXIST SBR A,B ADRI -1,Y ADRI -1,X CPZR B < ALORS ??? JNE SETV1 < IL N'EST PAS ISOLE, ON RECOMMENCE... PLR A STA ITEST < RESTAURATION DE 'ITEST'... < < CAS D'UN POINT NOIR ISOLE : ON < ADMET QU'ON EST A L'EXTERIEUR < DU CONTOUR CUMULE COURANT : < LR X,A SB CX FLT BSR AT0 < TEST DE NULLITE... FST GELTAX < DISTANCE A CX DU X DU PREMIER POINT < NOIR RENCONTRE DANS LA DIRECTION < DU VECTEUR ISSU DE (CX,CY). LR Y,A SB CY FLT BSR AT0 < TEST DE NULLITE... FST GELTAY < DE MEME DISTANCE DE CY A Y... XWOR%8: VAL 0 < < RECHERCHE DU POINT QUE L'ON VA < UTILISER DANS L'IMAGE 'TV2' : < LA IX FLT FSB FIX FST FX < COORDONNEE A 'FIX' PRES DU CENTRE < POLAIRE DE L'IMAGE 'TV2'. LA IY FLT FSB FIY FST FY < DE MEME EN Y... IF VERSIO-XXV2,XWOR%8,,XWOR%8 SETV4X: EQU $ CPZ PAS < MODE ??? JNE SETV69 < PAS#0 : ON PREND L'ANCIEN MODE QUI < CONSISTE A UTILISER DES CADRES SIMPLE- < MENT CONCENTRIQUES... CPZ IC0 < EST-CE C(0) ??? JE SETV69 < OUI, ON PREND LE CADRE EXTERIEUR... < < CAS PAS=0 : LES CADRES SONT RECALCULES < POUR CHAQUE POINT EN FONCTION DE LA < DISTANCE COURANTE DE C(N) A C(0) : < STX SAVEX STY SAVEY LA PILEM0 STA PILEM < REINITIALISATION DE LA PILE DES "MINIS". LA NPC0 < A=NOMBRE DE POINTS DE C(0), MP NPCN < QUE L'ON MULTIPLIE PAR LE NUMERO DU < POINT COURANT DE C(N), DV NPCNM1 < ET QUE L'ON DIVISE PAR LE NOMBRE DE < POINTS DE C(N) QUE L'ON NE CONNAIT < PAS ENCORE, ET QUE L'ON APPROXIME PAR < CELUI DE C(N-1)... FLT FDV FCOREC BSR AROND < ON APPORTE UNE CORRECTION... NGR A,A < EN EFFET, C(0) N'EST PAS PARCOURU < DANS LE MEME SENS QUE LES C(N)... AD NPC0 FLT FMP FKOREC < CORRECTION... BSR AROND SETV35: EQU $ JAGE SETV36 AD NPC0 < CALCUL MODULO 'NPC0'... JMP SETV35 SETV36: EQU $ CP NPC0 JL SETV42 < OK... SB NPC0 < CALCUL MODULO 'NPC0'... JMP SETV35 SETV42: EQU $ < A=NUMERO D'UN POINT DE C(0) QUE L'ON < ASSOCIE AU POINT COURANT DE C(N), PAR < LA FORMULE : < P(C(0))=P(C(N))*N(C(0))/N(C(N)) CE QUI < EST PEU DIFFERENT DE : < #P(C(N))*N(C(0))/N(C(N-1)), OU < 'P' DESIGNE UN NUMERO DE POINT, ET 'N' < LE NOMBRE DE POINTS D'UN CONTOUR... STA X0Y0 < SAUVEGARDE DU POINT INITIAL DE C(0). STA SXY STA MXY LY APILEM PUSH < INITIALISATION DE LA PILE DES "MINIS"... BSR ASPL FST LXY < ET INITIALISATION DE LA DISTANCE DU < POINT COURANT DE C(N) A C(0). STZ IXY < INITIALISATION DU PAS D'EXPLORATION < DE C(0) AU VOISINNAGE DE 'X0Y0'. SETV30: EQU $ IC IXY < PROGRESSION DU PAS D'EXPLORATION : LA IXY CP AMIXY < EST-CE FINI ??? JG SETV33 < OUI... AD X0Y0 BSR ASPLM < CALCUL DE LA LONGUEUR MINIMALE NON NULLE < DU POINT COURANT DE C(N) AU POINT < X0Y0 DE C(0). LA X0Y0 SB IXY BSR ASPLM < CALCUL DE LA LONGUEUR MINIMALE NON NULLE < DU POINT COURANT DE C(N) AU POINT < X0Y0 DE C(0). JMP SETV30 < VERS LA SUITE DE L'EXPLORATION DU < VOISINNAGE DE 'X0Y0'... SETV69: JMP SETV21 < RELAI... SETV33: EQU $ LA X0Y0 FLT FST FWORK LA MXY FLT FDV FWORK FST FKOREC < FKOREC=MXY/X0Y0. LA MXY SB X0Y0 < A=MXY-X0Y0, JAGE SETV43 < A=ABS(MXY-X0Y0), NGR A,A < A=ABS(MXY-X0Y0), SETV43: EQU $ CP DELTA < COMMENT EST LE NOUVEAU 'DELTA' PAR < RAPPORT AU PRECEDENT ??? STA DELTA < POUR LE COUP SUIVANT... JL SETV37 < NOUVEAU<PRECEDENT : ON PEUT REDUIRE LE < VOISINNAGE... SETV39: EQU $ IC AMIXY < NOUVEAU>=PRECEDENT : IL FAUT AUGMENTER < LE VOISINNAGE... JGE SETV38 < OK, PAS DE DEBORDEMENT... SETV37: EQU $ DC AMIXY < NOUVEAU<PRECEDENT : ON PEUT REDUIRE < LE VOISINNAGE... JLE SETV39 < DEBORDEMENT ?!??! SETV38: EQU $ LA AMIXY CPI MIXY < Y-A-T'IL DEBORDEMENT PAR LE BAS ??? JGE SETV41 < NON... LAI MIXY < OUI, ON BORNE INFERIEUREMENT... SETV41: EQU $ CP SAMIXY < Y-A-T'IL DEBORDEMENT PAR LE HAUT ??? JLE SETV40 < NON... LA SAMIXY < OUI, ON BORNE SUPERIEUREMENT... SETV40: EQU $ STA AMIXY < NOUVELLE DEFINITION DU VOISINNAGE... FLD LXY < ON ADMET QUE 'LXY' REPRESENTE < LE MINIMUM ABSOLU ENTRE LE POINT < COURANT DE C(N) ET LE VOISIN- < NAGE ASSOCIE DE C(0)... BSR ARAC < ON A DONC AINSI LA DISTANCE ENTRE LE < POINT COURANT DE C(N) AU POINT QUI LUI < EST ASSOCIE SUR C(0)... BSR AKFECH < DETERMINATION EVENTUELLE DE L'ECHELLE... XWOR%1: VAL -1 < POUR DIVISER PAR 2... ANDI NLIGM1?NPOLM1>XWOR%1 < ET QUE L'ON PREND MODULO LA MOITIE DE < L'IMAGE... STA MINX < ET L'ON DEFINIT STA MINY < AISNI LE CADRE COURANT... LBI NLIGM1?NPOLM1 IF NLIGM1-NPOLM1,,XWOR%, IF CA VA MERDER !!! XWOR%: VAL 0 SBR A,B STB MAXX STB MAXY LA IC0 CPI XICXCY < EN EST-ON AUX PREMIERS CONTOURS ??? JLE SETV4Y < OUI, ON CONNAIT DEJA (FIX,FIY)... CPZ ICXCY < (CX,CY) SONT-ILS UTILES ??? JE SETV4Y < OUI, DONC ON CONNAIT DEJA (FIX,FIY), < AINSI QUE LE POINT (FX,FY)... < < CAS OU (CX,CY) N'EST PAS UTILISE : < ON CALCULE LE VECTEUR DEPLACEMENT < A PARTIR DU VECTEUR JOIGNANT LE < CENTRE (CX,CY) AU POINT < COURANT DE C(N) : < LA SAVEX FLT FSB CX FST FWORK1 < FWORK1=SAVEX-CX, FMP FWORK1 FST FWORK LA SAVEY FLT FSB CY FST FWORK2 < FWORK2=SAVEY-CY. FMP FWORK2 FAD FWORK BSR ARAC FST FWORK < ON DISPOSE DE LA DISTANCE DU CENTRE < (CX,CY) AU POINT COURANT DE C(N)... FLD FWORK1 FDV FWORK FST FIX < D'OU LE VECTEUR DEPLACEMENT FLD FWORK2 FDV FWORK FST FIY < (FIX,FIY)... LA IX FLT FSB FIX FST FX < POINT DE DEPART DANS TV2, LA IY FLT FSB FIY FST FY < POINT DE DEPART DANS TV2... SETV4Y: EQU $ < < TENTATIVE DE SORTIE DU CADRE : < SETV21: EQU $ XWOR%8: VAL 0 SETV2: EQU $ FLD FX FAD FIX FST FX < ON PART DE (IX,IY) DANS LA DIRECTION < DU VECTEUR (CX,CY) --> (X,Y). BSR AROND LR A,X FLD FY FAD FIY FST FY < DE MEME SUR Y... BSR AROND LR A,Y IF VERSIO-XXV1,XWOR%8,,XWOR%8 JALE SETV3 < SORT DE 'TV2'... CPI NLIGM1 JGE SETV3 < ON SORT DE 'TV2'... LR X,A JALE SETV3 < ON SORT DE 'TV2'... CPI NPOLM1 JL SETV2 < TANT QU'ON RESTE A L'INTERIEUR < DE 'TV2', ON TENTE D'EN SORTIR... XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 CP MINY JLE SETV3 < SORT DU CADRE DE TV2... CP MAXY JGE SETV3 < IDEM... LR X,A CP MINX JLE SETV3 < IDEM... CP MAXX JL SETV2 < TANT QU'ON RESTE DANS LE CADRE, ON < TENTE D'EN SORTIR... XWOR%8: VAL 0 SETV3: EQU $ IF VERSIO-XXV1,XWOR%8,,XWOR%8 LR X,A SB IX FLT FDV GELTAX FMP DELTAX < LES COORDONNEES DU POINT DE LA < FRONTIERE DE 'TV2' SONT RAMENEES < VERS (IX,IY) DANS UN RAPPORT EGAL < A "DISTANCE (CX,CY) A LA FRONTIERE < EXTERIEURE DU REMPLISSAGE" SUR < "DISTANCE (CX,CY) AU POINT COURANT < DU CONTOUR"... BSR AROND AD IX STA XS LR Y,A SB IY FLT FDV GELTAY FMP DELTAY < DE MEME SUR LES Y... BSR AROND AD IY XWOR%8: VAL 0 IF VERSIO-XXV2,XWOR%8,,XWOR%8 STX XS < C'EST LE POINT DE SORTIE LR Y,A < DU CADRE DE 'TV2' QUI EST LE BON... XWOR%8: VAL 0 SETV6: EQU $ STA YS CPZ SENS < QUEL SENS ??? JNE SETV10 < 1 -->2... < < CAS DU SENS TV2 --> TV1 : < LA CTCDA STA XCTCDA BSR ASPGPS < A=NIVEAU(X,Y) DANS 'TV2', STZ XCTCDA PLR B,X,Y,W STX XS STY YS BSR ASPRPS < ET ON GENERE L'IMAGE 'TV1'... JMP SETV11 < < CAS DU SENS TV1 --> TV2 : < SETV10: EQU $ PLR B,X,Y,W LA XS LB YS PSR A,B < SAUVEGARDE DES COORDONNEES (XS,YS) DU < POINT DE L'IMAGE 'TV2'. STX XS < LE POINT (XS,YS) EST PRIS STY YS < COMME LE POINT COURANT DU CONTOUR : BSR ASPGPS < A=NIVEAU DU POINT COURANT DU CONTOUR < CONTENU DANS 'TV1'... PLR B STB YS < RESTAURATION DU POINT (XS,YS) PLR B STB XS < DE L'IMAGE 'TV2'... LB CTCDA STB XCTCDA < POUR ACCEDER A 'TV2'... BSR ASPRPS < ET ON TRANSFERE LE NIVEAU DU POINT < COURANT DU CONTOUR 'TV1' AU POINT < COURANT DE 'TV2'... STZ XCTCDA SETV11: EQU $ < < PASSAGE AUX OPERATIONS VIRTUELLES : < SETV5: EQU $ LA APS < SBT. JMP VIRT RSETV: EQU $ LA APR < RBT. JMP VIRT TESTV: EQU $ LA APT < TBT. JMP VIRT INVEV: EQU $ LA API VIRT: EQU $ STA AOP < MISE EN PLACE DE LA ROUTINE < VARIABLE... PSR B,X,Y LR Y,A MP NMPL < B=NUMERO 1ER MOT DE LA LIGNE < CONTENANT LE POINT ARGUMENT. LR X,A SLRS 4 ADR A,B < B=NUMERO DU MOT CONTENANT < LE POINT ARGUMENT. LAI '0F ANDR A,X < X=NUMERO DU BIT REPRESENTANT < LE POINT ARGUMENT DANS LE < MOT (B). LR B,Y < Y=INDEX MOT. XR X,Y LA &AIMAGV < ACCES AU MOT COURANT... XR X,Y < X=NUMERO BIT, Y=NUMERO MOT. BSR AOP < EXECUTION OPERATION SPECIFIQUE. XR X,Y < X=NUMERO MOT, Y=NUMERO BIT. LB AOP < ACCES A LA FONCTION DEMANDEE. XR A,B CP APT < EST-CE LE TEST VIRTUEL ??? XR A,B JE VIRT3 < OUI, DONC PAS DE MISE A JOUR < DE L'IMAGE VIRTUELLE... STA &AIMAGV < MAJ IMAGE VIRTUELLE. VIRT3: EQU $ PLR B,X,Y RSR PAGE < < < T E S T D E N U L L I T E : < < T0: EQU $ FCAZ JNE T01 < OK, (A,B)#0... FLD F1 < SI NUL, ON LE REMPLACE PAR 1... T01: EQU $ RSR PAGE < < < R E T O U R D E L A Z O N E S C R A T C H < E N M E M O I R E I M A G E : < < CONTI: EQU $ LRM A,B,X WORD IMAGV < ZONE SCRATCH, WORD IMAGR < ZONE IMAGE, WORD LIMAG < NOMBRE DE MOTS A DEPLACER. MOVE < TRANSFERT SCRATCH --> RESIDENT... RSR < < < R A Z D E L A Z O N E S C R A T C H : < < RAZDK: EQU $ LX ALIMAG RAZ1: EQU $ ADRI -1,X STZ &AIMAGV < ET ON CLEAR... ADRI 1,X JDX RAZ1 RSR PAGE < < < I N I T I A L I S A T I O N P O U R S E T , R E S E T : < < ARG: EQU $ LR Y,A MP NMPL < CONVERSION DE L'Y DU POINT EN < UN NUMERO DE MOT. ADR B,W LR X,A SLRS 4 ADR A,W < W=ADRESSE MOT CONTENANT LE POINT (X,Y). LAI 'F ANDR A,X < CALCUL DE X MODULO 16 ; < X=NUMERO DU BIT DANS LE MOT. LA 0,W < A=MOT CONTENANT LE POINT (X,Y). RSR < < < M I S E D ' U N B I T A 1 : < < < ARGUMENTS : < X ET Y CONTIENNENT X ET Y DU POINT. < W=ADRESSE IMAG (IMAGE VIDEO). < < SET: EQU $ PSR B,X,W BSR AARG < INITIALISATIONS... SBT 0,X < POSITIONNEMENT DU POINT. STA 0,W < MISE A JOUR DE CE MOT. PLR B,X,W RSR < < < E F F A C E M E N T D ' U N P O I N T : < < < ARGUMENTS : < X ET Y CONTIENNENT X ET Y DU POINT. < W=ADRESSE IMAG (IMAGE VIDEO). < < RESET: EQU $ PSR B,X,W BSR AARG < INITIALISATIONS... RBT 0,X < EFFACEMENT DU POINT. STA 0,W < MISE A JOUR DE CE MOT. PLR B,X,W RSR < < < I N V E R S I O N V I D E O U N P O I N T : < < < ARGUMENT : < X ET Y CONTIENNENT X ET Y DU POINT A INVERSER. < W=ADRESSE IMAG (IMAGE VIDEO). < < INVER: EQU $ PSR B,X,W BSR AARG < INITIALISATIONS... IBT 0,X < INVERSION VIDEO DU POINT. STA 0,W < MISE A JOUR DE CE MOT. PLR B,X,W RSR < < < C L I G N O T E M E N T D ' U N P O I N T : < < CLIGN: EQU $ PSR A,B LBI 5>1 < B=NBRE DE CLIGNOTEMENTS (PAIR !!!). CLIGN1: EQU $ BSR AINVER < INVERSION DU POINT (X,Y). PSR X LAD STABIL < STABILISATION VIDEO. SVC 0 PLR X ADRI -1,B < DECOMPTAGE. CPZR B < EST-CE FINI ??? JG CLIGN1 < NON. PLR A,B RSR < < < T E S T D ' U N P O I N T : < < < FONCTION DE ITEST : < ITEST=0 : CARY=1 SI POINT=0 , < =1 : CARY=1 SI POINT=1. < < < ARGUMENTS : < X ET Y CONTIENNENT L'X ET L'Y DU POINT , < W=ADRESSE IMAG. < < < RESULTAT : < CARY POISITIONNE PAR LE POINT (0/1) 9 < < TEST: EQU $ PSR B,X,W BSR AARG < INITIALISATIONS... CPZ ITEST < TEST DE LA VALEUR LOGIQUE DU < POINT. JNE E1022 < CONVENTION NORMALE (1). IBT 0,X < CAS DES CONVENTIONS INVERSEES (1) E1022: EQU $ TBT 0,X < TEST DU POINT. PLR B,X,W RSR PAGE < < < C O M P T A G E D ' U N V O I S I N : < < < FONCTION : < CETTE ROUTINE INCREMENT B D'UNE UNITE < SI LE POINT (X,Y) EXISTE ET EST A 1. < < < ARGUMENT ET RESULTAT : B,X,Y. < < VOISI: EQU $ BSR AEXIST < TEST DU POINT (X,Y) JANE VOISI1 < (X,Y) N'EXISTE PAS OU EST A 0. ADRI 1,B < (X,Y) EXISTE ET EST A 1. STX POINT1+X < SAUVEGARDE D'UN POINT A 1. STY POINT1+Y < UTILISE PAR LES CHANGEMENTS < DE POINT DE DEPART). VOISI1: EQU $ RSR < < < E X I S T E N C E E T V A L E U R P O I N T : < < < ARGUMENT : < X ET Y CONTIENNENT L'X ET L'Y D'UN POINT. < < < RESULTAT : < A#0 : M(X,Y) N'EXISTE PAS , OU < M(X,Y) EXISTE ET M(X,Y)=0. < < EXIST: EQU $ LR X,A JAL NEXIST < X INVALIDE (<0). CP NPPL JG NEXIST < X INVALIDE (>NPPL). LR Y,A JAL NEXIST < M(X,Y) N'EXISTE PAS : A<0#0 !!! CP NLIN JG NEXIST < M(X,Y) N'EXISTE PAS : A>0#0 !!! < < CAS OU LE POINT M(X,Y) EXISTE : < BSR ATEST < TEST DE LA VALEUR DE M(X,Y). LAI 1 SBCR A < A=0 SI M(X,Y)=1. NEXIST: EQU $ RSR < < < E X I S T E N C E V I R T U E L L E : < < XISTV: EQU $ LR X,A JAL NXISTV < POINT VIRTUEL INEXISTANT. CP NPPL JG NXISTV < POINT VIRTUEL INEXISTANT. LR Y,A JAL NXISTV < POINT VIRTUEL INEXISTANT. CP NLIN JG NXISTV < POINT VIRTUEL INEXISTANT. BSR ATESTV < TEST D'UN POINT VIRTUEL. LA INDIC < A=RESULTAT DU TEST VIRTUEL. NXISTV: EQU $ RSR < VOIR 'EXIST' POUR (A). PAGE < < < E N T R E E U N E C O O R D O N N E E : < < < ARGUMENT : < A=@MESSAGE A EMETTRE. < < < RESULTAT : < A=COORDONNEE (X OU Y). < < COORD1: EQU $ < RETOUR EN ERREUR. LR B,A < RESTAURE A=@MESSAGE. COORD: EQU $ PSR X,Y LR A,B < SAVE B=@MESSAGE. BSR APIHEX < ENTREE D'UNE COORDONNEE... PLR X,Y JNE COORD1 < ERREUR : ON RECOMMENCE. JAL COORD1 < COORDONNEE<0 : ERREUR.. CPI X20-1 < DEBORDEMENT : ERREUR... JG COORD1 < ERREUR... RSR < OK, (A)=VALEUR HEXA. PAGE < < < E X T R A C T I O N D ' U N E R A C I N E C A R R E E : < < < FONCTION : < CE SOUS-PROGRAMME EXTRAIT LA < RACINE CARREE D'UN NOMBRE PAR < LA METHODE DE NEWTON, C'EST-A-DIRE < A PARTIR DE LA SUITE : < U(N+1)=(U(N)+K/U(N))/2, < OU K DESIGNE LE NOMBRE DONT ON < EXTRAIT LA RACINE... < < < ARGUMENT : < A,B=NOMBRE DONT ON EXTRAIT LA RACINE. < < < RESULTAT : < A,B=RACINE DU NOMBRE ARGUMENT. < < RAC: EQU $ FCAZ JE RAC2 < NOMBRE=0 ==> RACINE=0... JG RAC3 < OK, NOMBRE>0... QUIT 1 < ??!??!?! RAC3: EQU $ PSR X,Y LR A,X < X ET LR B,Y < Y MEMORISENT LE NOMBRE ARGUMENT. RAC1: EQU $ FST FWORK LR X,A LR Y,B FDV FWORK < K/U(N), FAD FWORK < U(N)+K/U(N), FMP F05 < (U(N)+K/U(N))/2. FCAM FWORK < TEST DE FIN ??? JNE RAC1 < NON... PLR X,Y RAC2: EQU $ RSR PAGE IF MODE-VISU,XWOR%7,,XWOR%7 < < < E D I T I O N D ' U N M E S S A G E : < < < ARGUMENT : < A=ADRESSE MOT DU MESSAGE, DONT LE < PREMIER OCTET EST LA LONGUEUR. < < PRINT: EQU $ PSR A,X,W LR A,W ADR A,A ADRI 1,A < CALCUL DE L'ADRESSE OCTET DU MESSAGE. STA DEMOUT+1 LBY 0,W < ACCES A LA LONGUEUR... STA DEMOUT+2 LAD DEMOUT SVC 0 < ENVOI DU MESSAGE... PLR A,X,W RSR XWOR%7: VAL 0 PAGE < < < C O N V E R S I O N H E X A --> B I N A I R E : < < < ARGUMENT : < LE BUFFER 'REP'. < < < RESULTAT : < B=0 : (A)=VALEUR BINAIRE, < B#0 : ERREUR DE SYNTAXE HEXA-DECIMALE. < LES INDICATEURS POSITIONNES SUR (B). < < HEX: EQU $ BASE10: VAL 10 BASE16: VAL 16 PSR X,Y LYI NBRHEX LXI 0 < INDEX DU BUFFER DE REPONSE. LBI 0 < CLEAR LE REGISTRE B. HEX1: EQU $ LBY &AREPX < A=CARACTERE COURANT DU BUFFER. ADRI -"0",A JAL HEX4 < ERREUR : CARACTERE NON RECONNU. CPI BASE10 < EST-CE UN CHIFFRE ??? JL HEX2 < OUI , C'EST UN CHIFFRE. ADRI -"A"+"9"+1,A < NON. CPI BASE10 < VALIDATION. JL HEX4 < ERREUR : CARACTERE NON RECONNU. CPI BASE16 < VALIDATION. JGE HEX4 < ERREUR : CARACTERE NON RECONNU. HEX2: EQU $ SCRS NBITMO/NBRHEX < MISE DES 4 BITS EN TETE DE A. SCLD NBITMO/NBRHEX < ET CONCATENATION A B. ADRI 1,X < PROGRESSION DE L'INDEX. CPR X,Y < EST-CE FINI ??? JNE HEX1 < NON , ON CONTINUE. LR B,A < A=VALEUR BINAIRE DE (REP). LBI 0 < B=0 : ETOUR OK. HEX3: EQU $ PLR X,Y CPZR B < POSITIONNEMENT DES INDICATEURS. RSR < < RETOURS EN ERREUR : < HEX4: EQU $ LR B,A < A=VALEUR COURANTE... LBI 1 < B#0. JMP HEX3 < VERS LA SORTIE ... PAGE < < < R E M P L I S S A G E D ' U N C O N T O U R : < < CONTO: EQU $ STZ FIRST < POUR DETECTER LE PREMIER CUMUL DES < CONTOURS... STZ ANGLE < POUR LA DISCRIMINATION INTERIEUR ET < EXTERIEUR. STZ ITEST IC ITEST < RETOUR AUX TESTS DIRECTS (1)... IF VERSIO-XXV2,XWOR%8,,XWOR%8 STZ NPC0 < POUR LE COMPTAGE DES POINTS DE C(0). STZ IC0 < COMPTAGE DES CONTOURS... < < REINITIALISATION DU CADRE DE 'TV2' : < STZ MINX LAI NPOLM1 STA MAXX STZ MINY LAI NLIGM1 STA MAXY XWOR%8: VAL 0 < < C U M U L D E S 3 C O M P O S A N T E S < D E L ' I M A G E R E S I D E N T E : < LX ALIMAG SPOR1: EQU $ ADRI -1,X LA &AIMAGR OR &AIMAGV OR &AIMAGB STA &AIMAGR < ET ON CUMULE DANS LE ROUGE... STZ &AIMAGV < ET ON EST STZ &AIMAGB < TRES PROPRE... ADRI 1,X JDX SPOR1 < < R A Z L A B O R D U R E D E L ' I M A G E : < LYI 0 LXI 0 < < BORDURE SUPERIEURE (Y=0) : < RAZE1: EQU $ BSR ATEST < TEST DU POINT M(X,0) ??? JNC RAZE1X < NOIR... ADRI 1,Y < BLANC : BSR ASET < ON MET A BLANC LE POINT M(X,1)... ADRI -1,Y BSR ARESET < ET ON MET A NOIR LE POINT M(X,0). RAZE1X: EQU $ ADRI 1,X LR X,A CP NPPL JLE RAZE1 ADRI -1,X < < BORDURE DROITE (X=NPPL) : < RAZE2: EQU $ BSR ATEST < TEST DU POINT M(NPPL,Y) ??? JNC RAZE2X < NOIR... ADRI -1,X < BLANC : BSR ASET < ON MET A BLANC LE POINT M(NPPL-1,Y)... ADRI 1,X BSR ARESET < ET ON MET A NOIR M(NPPL,Y). RAZE2X: EQU $ ADRI 1,Y LR Y,A CP NLIN JLE RAZE2 ADRI -1,Y < < BORDURE INFERIEURE (Y=NLIN) : < RAZE3: EQU $ BSR ATEST < TEST DU POINT M(X,NLIN) ??? JNC RAZE3X < NOIR... ADRI -1,Y < BLANC : BSR ASET < ON MET A BLANC LE POINT M(X,NLIN-1)... ADRI 1,Y BSR ARESET < ET ON MET A NOIR LE POINT M(X,NLIN). RAZE3X: EQU $ ADRI -1,X CPZR X JGE RAZE3 ADRI 1,X < < BORDURE GAUCHE (X=0) : < RAZE4: EQU $ BSR ATEST < TEST DU POINT M(0,Y) ??? JNC RAZE4X < NOIR... ADRI 1,X < BLANC : BSR ASET < ON MET A BLANC LE POINT M(1,Y)... ADRI -1,X BSR ARESET < ET ON MET A NOIR LE POINT M(0,Y). RAZE4X: EQU $ ADRI -1,Y CPZR Y JGE RAZE4 ADRI 1,Y < < R E C U P E R A T I O N P O I N T < D E D E P A R T : < CUR1: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAD OG SVC 0 < OPEN GRAPHIQUE. LAD CU SVC 0 < MISE EN FONCTION CURSEUR. LAD LCU SVC 0 < LECTURE DU CURSEUR. < < NOTA : < ON NE TESTE PAS LES ERREURS < EN RETOUR (CAS DU PASSAGE EN < BATCH...), CAR 'CURSOR' EST INITIALISE < PAR 'N'. < LA CURSOR+1 < Y(CURSEUR). SLRS DEDY < REDUCTION VIDEO. SB NLIN < LES AXES GRAPHIQUES ET < VIDEOS SONT INVERES. NGR A,Y < Y=Y(CURSEUR VIDEO). LA CURSOR+2 < X(CURSEUR). SLRS DEDX < REDUCTION VIDEO. LR A,X < X=X(CURSEUR VIDEO). BSR ACLIGN < CLIGNOTEMENT DU POINT (X,Y). LBY CURSOR < A=COMMANDE ASSOCIEE. < < COMMANDES RECONNUES : < C : CLIGNOTEMENT DU CURSEUR, < H : ENTREE PAR LE CURSEUR, RECHERCHE VERS LE HAUT, < B : ENTREE PAR LE CURSEUR, RECHERCHE VERS LE BAS. < CPI "C" JE CUR1 < CLIGNOTEMENT SEUL... LBI -1 < VERS LE HAUT A PRIORI... STB FX < SAVE LA DIRECTION... CPI "H" JE CUR3 < VERS LE HAUT... LBI 1 < VERS LE BAS A PRIORI... STB FX < SAVE LA DIRECTION... CPI "B" JNE CUR1 < RIEN COMPRIS, ON RECOMMENCE. XWOR%7: VAL 0 IF MODE-ITEM,XWOR%7,,XWOR%7 BSR AIN < ENTREE D'UN CARACTERE "H" OU "B" : LBI -1 CPI "H" JE CUR4 < VERS LE HAUT (-1)... LBI 1 CPI "B" JNE CUR1 < ????!?! CUR4: EQU $ STB FX < VERS LE HAUT (-1), OU VERS LE BAS (+1). < < ENTREE EN HEXA DES COORDONNEES : < BSR ACOORD < ENTREE DE X. LR A,X < X=X(CURSEUR VIDEO). BSR ACOORD < ENTREE DE Y. LR A,Y < Y=Y(CURSEUR VIDEO). XWOR%7: VAL 0 < < ON A UN POINT DE DEPART : < CUR3: EQU $ STX DEP+X STY DEP+Y < < INITIALISATION DU DISQUE : < BSR ARAZDK < < RECHERCHE D'UN POINT DE DEPART : < LX DEP+X < INITIALISATION REGISTRE X SUR DEP, LY DEP+Y < INITIALISATION DE Y SUR Y(DEP). BSR ATEST < VALIDATION DE DEP. JNC DEP1 < OK, DEP=0. IF MODE-VISU,XWOR%7,,XWOR%7 LAD M1 < ERREUR : DEP=1 !!! BSR APRINT XWOR%7: VAL 0 BR ALOOP < ABORT. DEP1: EQU $ LA FX ADR A,Y < VERS LE HAUT (-1), OU LE BAS (+1). LR Y,A JAL DEP2X < HORS DE L'IMAGE... CP NLIN < VALIDATION DE Y. JLE DEP2 < OK, Y DANS L'IMAGE. DEP2X: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAD M2 < ERREUR, Y HORS L'IMAGE !!!! BSR APRINT XWOR%7: VAL 0 BR ALOOP < PUIS ABORT... DEP2: EQU $ BSR ATEST < TEST DU POINT (X,Y). JC DEP3 < ON S'ARRETE SUR LE 1ER POINT < A 1 SUIVANT UN POINT A 0. STY DEP+Y < SINON, LE POINT (X,Y) DEVIENT < LE NOUVEAU POINT DEP. JMP DEP1 < ET ON RECOMMENCE... DEP3: EQU $ < < M I S E A U N O I R D E L ' I M A G E < V I S U A L I S E E ' T V 1 ' O U ' T V 2 ' : < CPZ SENS < QUEL SENS ??? JE RAZI3 < 2 --> 1, IL FAUT RAZER 'TV1'... LA CTCDA < 1 --> 2, IL FAUT RAZER 'TV2'... STA XCTCDA < POUR L'ACCES A 'TV2'. RAZI3: EQU $ LX NPPL RAZI1: EQU $ LY NLIN RAZI2: EQU $ LAI 0 STX XS STY YS BSR ASPRPS < MISE AU NOIR (0) DE (XS,YS)... ADRI -1,Y CPZR Y JGE RAZI2 ADRI -1,X CPZR X JGE RAZI1 STZ XCTCDA < < DEP EST NOTRE POINT DE DEPART : < LX DEP+X LY DEP+Y BSR ASETV < MARQUAGE DU POINT DE DEPART. < < R E C H E R C H E D U C O N T O U R I N T E R I E U R : < CONT1: EQU $ STX PTC+X < SAVE LE POINT COURANT. STY PTC+Y < SAVE LE POINT COURANT. BSR AROT1 < ROTATION A DROITE PRELIMINAIRE. CONT3: EQU $ BSR AMOV < DEPLACEMENT DU POINT (X,Y). STZ ITEST < AFIN DE TESTER LES POINTS A 0. BSR AEXIST < TEST DU POINT (X,Y). JAE CONT2 < OK, (X,Y)=0 ET EXISTE (ITEST=0). CONT5: EQU $ LX PTC+X < RETOUR ARRIERE SUR PTC. LY PTC+Y < RETOUR ARRIERE SUR PTC. BSR AROT3 < ROTATION DU VECTEUR (VX,VY). JMP CONT3 < ET ON RECOMMENCE... < < CAS OU L'ON A TROUVE UN POINT A 0 QUI EXISTE : < CONT2: EQU $ LBI 0 < B=COMPTEUR DES VOISINS DU POINT < TROUVE (X,Y). IC ITEST < AFIN DE TESTER LES POINTS A 1. CONT4: EQU $ LA VX STA SVX < SAVE VX AVANT LE DECOMPTE. LA VY STA SVY < SAVE VY AVANT LE DECOMPTE. LA ANGLE STA SANGLE < SAVE ANGLE AVANT LE DECOMPTE. PSR X,Y < SAVE LE POINT COURANT (X,Y). BSR AROT1 < ON SE PLACE A DROITE DU < MOUVEMENT (VX,VY). BSR AMOV BSR AVOISI < ET ON TESTE LES 3 POINTS < IMMEDIATEMENT A DROITE DU < POINT COURANT SUIVANT LE < MOUVEMENT (VX,VY). BSR AROT1 BSR AMOV BSR AVOISI BSR AROT1 BSR AROT1 BSR AMOV BSR AMOV BSR AVOISI PLR X,Y < RESTAURE LE POINT COURANT. LA SANGLE STA ANGLE < RESTAURE ANGLE. LA SVX STA VX < RESTAURE VX. LA SVY STA VY < RESTAURE VY. CPZR B < LE POINT (X,Y) A-T'IL AU < MOINS 1 VOISIN ??? JE CONT5 < NON, ON FAIT DONC UN RETOUR ARRIERE < SUR PTC, ET ROTATION DE (VX,VY). < < MARQUAGE DU POINT (X,Y) : < BSR ASETV < MARQUAGE DE (X,Y), MEME < S'IL EST LE POINT DE DEPART. IF VERSIO-XXV2,XWOR%8,,XWOR%8 CPZ PAS < MODE ??? JNE SETV22 < CAS DES CADRES SIMPLES... PSR Y < CADRES ADAPTATIFS : SWBR X,B ORR Y,B < B=COORDONNEES (X,Y), LA NPC0 < A=NUMERO PAR RAPPORT A 0 DU POINT < COURANT DE C(0), IC NPC0 < ET COMPTAGE... JNE CONT71 < OK... QUIT 1 < PASSAGE PAR 0 ??? CONT71: EQU $ LYI YSTORE BSR AGZB < ET AINSI, ON MEMORISE C(0). PLR Y SETV22: EQU $ XWOR%8: VAL 0 LR X,A CP DEP+X < EST-ON AU POINT DE DEPART ??? JNE CONT1 < NON, AU SUIVANT... LR Y,A CP DEP+Y < EST-ON AU POINT DE DEPART ??? JNE CONT1 < NON, AU SUIVANT... < < ON A LE CONTOUR INTERIEUR : < CONT7: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAD M5 < PARCOURS EXTERIEUR A PRIORI. CPZ ANGLE < INTERIEUR OU EXTERIEUR ??? JG CONT60 < EXTERIEUR. JL CONT70 < INTERIEUR. WORD '1E16 < E R R E U R P R O G !!! CONT70: EQU $ LAD M4 < INTERIEUR. CONT60: EQU $ BSR APRINT < ENVOI DU MESSAGE. XWOR%7: VAL 0 BSR ACONTI < ON AMENE EN MEMOIRE IMAGE < LE CONTOUR QUE L'ON A < GENERE, CAR C'EST DE LUI < QU'ON VEUT LES LIMITES !!! LRM A,B,X WORD IMAGR WORD IMAGB WORD LIMAG MOVE < INITIALISATION DU REMPLISSAGE... < < L I M I T E S V E R T I C A L E S C O N T O U R : < LA AIMAG STA AIMAG0 < RELAI D'ACCES AUX LIGNES. LYI 0 < Y=NUMERO DE LIGNE COURANTE. LOOK1: EQU $ LXI CNMPL < INDEX MOT SUR LA LIGNE. LOOK2: EQU $ CPZ &AIMAG0 < NOIR OU PAS ??? JNE LOOK3 < PAS NOIR, ON ARRETE... JDX LOOK2 < TANT QUE C'EST NOIR, < ON CONTINUE. ADRI 1,Y < LIGNE SUIVANTE. LA AIMAG0 ADRI CNMPL,A < PROGRESSION @LIGNE COURANTE. STA AIMAG0 JMP LOOK1 < TEST LIGNE SUIVANTE. LOOK3: EQU $ STY YMIN < Y DONNE LA DERNIERE LIGNE < LORS DES BALAYGES DE BAS < EN HAUT DE L'IMAGE. LAI CNMPL MP NLIN LR B,A AD AIMAG STA AIMAG0 < RELAI D'ACCES A LA DERNIERE < LIGNE DE L'IMAGE. LY NLIN < Y=NUMERO DE LIGNE COURANTE. LOOK4: EQU $ LXI CNMPL < INDEX MOT SUR LA LIGNE. LOOK5: EQU $ CPZ &AIMAG0 < NOIR OU PAS ??? JNE LOOK6 < ON ARRETE AU 1ER NON NOIR. JDX LOOK5 < TANT QUE C'EST NOIR, < ON CONTINUE... ADRI -1,Y < PASSAGE LIGNE PRECEDENTE. LA AIMAG0 ADRI -CNMPL,A < PROGRESION @LIGNE COURANTE. STA AIMAG0 JMP LOOK4 LOOK6: EQU $ STY YMAX < Y DONNE LA 1ERE LIGNE A TESTER < LORS DES BALAYAGES DE BAS < EN HAUT DE L'IMAGE. IF VERSIO-XXV2,XWOR%8,,XWOR%8 < < DETERMINATION DU FACTEUR D'ECHELLE : < FLD FK < 'FK' A PRIORI... CPZ IFECH < Y-A-T'IL UNE ECHELLE DYNAMIQUE ??? JLE LOOK10 < NON, ON PREND BIEN 'FK'... FLD F0 < OUI, FST LXY < INITIALISATION LA RECHERCHE DE LA PLUS < GRANDE LONGUEUR DANS LE CONTOUR < INTERIEUR. LAI 0 < A=NUMERO DU PREMIER POINT... LOOK20: EQU $ PSR A BSR AGZBL < (B,A)=(X,Y) DU PREMIER POINT, STB SAVEX < X DU PREMIER POINT, STA SAVEY < Y DU PREMIER POINT. PLR A < A=NUMERO DU POINT DE DEPART COURANT... LX NPC0 < X=NOMBRE DES TESTS A FAIRE A PARTIR DU < POINT DE DEPART COURANT, PSR A,Y < QUE L'ON RESAUVEGARDE... LOOK11: EQU $ PSR A,X < SAVE LE NUMERO DU POINT COURANT, BSR ASPL < ET CALCUL DE SA DISTANCE AU PREMIER < POINT... FCAM LXY < ALORS EST-ELLE MAX ??? JLE LOOK12 < NON... FST LXY < OUI, ON LA MEMORISE... CPZ ICXCY < ET-CE LE MODE (CX,CY) AUTOMATIQUE ??? JGE LOOK70 < NON, ON CONNAIT (CX,CY)... LR X,A < OUI, ON CALCULE (CX,CY), AD SAVEX < COMME LE MILIEU DE 'LXY'... STA CX < (UN PETIT PEU APRES...). LR Y,A AD SAVEY STA CY LOOK70: EQU $ LOOK12: EQU $ PLR A,X < A=NUMERO DU POINT COURANT... ADRI 1,A < PASSAGE AU POINT SUIVANT... CP NPC0 JL LOOK21 SB NPC0 < CALCUL MODULO 'NPC0'... LOOK21: EQU $ JDX LOOK11 < AU SUIVANT... PLR A,Y < A=NUMERO DU POINT DE DEPART COURANT, ADRI 1,A < ET PASSAGE AU SUIVANT... CP NPC0 < EXISTE-T'IL ??? JL LOOK20 < OUI... CPZ ICXCY < EST-CE LE MODE (CX,CY) AUTOMATIQUE ??? JGE LOOK71 < NON... XWOR%9: VAL 2=0 < OUI, POUR DIVISER PAR 2... LA CX SLRS XWOR%9 < ON SE PLACE AU MILIEU DE 'LXY'... FLT FAD F05 < AFIN QUE (CX,CY) N'APPARTIENNE A < AUCUN CONTOUR... FST CX LA CY SLRS XWOR%9 FLT FAD F05 FST CY LOOK71: EQU $ LAI NLIGM1?NPOLM1 < NON, FLT FST FWORK FMP FWORK FST FWORK FAD FWORK < ON CALCULE LE CARRE DE LA DIAGONALE DE < L'IMAGE 'TV2'... FDV LXY < ON CALCULE LE RAPPORT : < DIAGONALE 'TV2'/LXY... BSR ARAC < ET OUI... LOOK10: EQU $ FST FECH < CHOIX DU FACTEUR D'ECHELLE... < < INITIALISATION DU COMPTAGE DES POINTS : < LA NPC0 STA NPCN STA NPCNM1 XWOR%8: VAL 0 < < < R E M P L I S S A G E D U C O N T O U R : < < < FONCTION DES COULEURS DE L'IMAGE RESIDENTE : < VERT : CONTOUR COURANT, < ROUGE : SQUELETTE, < BLEU : REMPLISSAGE (PAR CUMUL DES CONTOURS). < < CONT18: EQU $ BSR ACONTI < CHARGEMENT EN MEMOIRE DU < CONTOUR GENERE A L'ETAPE < PRECEDENTE. BSR ARAZDK < INITIALISATION DU CONTOUR < SUIVANT. IF VERSIO-XXV2,XWOR%8,,XWOR%8 LA NPC0 SLRS 1 < ON DIVISE PAR 2, ADRI 1,A < PAR PRUDENCE... STA AMIXY < CE QUI DONNE LE VOISINNAGE INITIAL... STA SAMIXY < ET SAVE... FLD F1 FST FKOREC < FACTEUR CORRECTIF... LA NPCNM1 FLT FST FWORK LA NPCN FLT FDV FWORK FST FCOREC < FCOREC=FACTEUR CORRECTIF LORSQU'ON < UTILISE C(N-1) A LA PLACE DE C(N) ; < EN GENERAL IL EST SUPERIEUR A 1... STZ DELTA LA NPCN STA NPCNM1 < C(N-1) <-- C(N), STZ NPCN < ET INITIALISATION DE C(N)... IC IC0 < COMPTAGE DES CONTOURS... XWOR%8: VAL 0 < < SUPPRESSION EVENTUELLE DES POINTS 0-ISOLES OU 1-ISOLES : < STZ ITEST IC ITEST ISOL8: EQU $ STZ DOUBLE < A CHAQUE REEXPLORATION, ON < REINITIALISE 'DOUBLE'. STZ PREM IC PREM < AVANT CHAQUE TOUR, ON < INDIQUE QUE LE 1ER POINT N'A < PAS ETE RENCONTRE. STZ NISOL < INITIALISATION DU NBRE DE < POINTS AINSI ELIMINES. LY YMAX < Y=1ERE LIGNE A TESTER. ISOL1: EQU $ LX NPPL < INITIALISATION COORDONNE X. ISOL2: EQU $ PSR W < SAVE @IMAGE VIDEO. LR Y,A MP NMPL < B=@ 1ER MOT DE LA LIGNE (Y). ADR B,W LR X,A SLRS 4 ADR A,W < W=ADRESSE MT COURANT. LA 0,W < A=MOT COURANT. PLR W < RESTAURE @IMAGE. CPI 'FFFF JE ISOL20 < CAS D'UN MOT TOUT BLANC. JANE ISOL9 < MOT PARTIELLEMENT BLANC. ISOL20: EQU $ LR X,A < DANS LE CAS D'UN MOT TOUT ANDI 'FFF0 < BLANC OU TOUT NOIR, ON LR A,X < PASSE AU PRECEDENT... JMP ISOL7 < VERS LE CHANGEMENT DE MOT. ISOL9: EQU $ BSR AEXIST < (X,Y) EST-IL A 1 ??? JANE ISOL7 < NON, DONC ININTERESSANT... LBI 0 < B=NBRE DE VOISINS DU POINT < COURANT (X,Y). ADRI 1,X < POINT (X+1,Y). BSR AVOISI ADRI -1-1,X < POINT (X-1,Y). BSR AVOISI ADRI 1,X ADRI -1,Y < POINT (X,Y-1). BSR AVOISI ADRI 1+1,Y < POINT (X,Y+1). BSR AVOISI ADRI -1,Y < RETOUR AU POINT (X,Y). LR B,A < A=NBRE DE VOISINS DE (X,Y). JANE ISOL10 < OK POINT 1-ISOLE AU MOINS... WORD '1E16 < E R R E U R P R O G !!! ISOL10: EQU $ CPI 4 JNE ISOL11 < < CAS D'UN POINT A 4 VOISINS 'ORTHOGONAUX' : < IC DOUBLE < ON LE COMPTE IC DOUBLE < 2 FOIS... JMP ISOL7 < ET C'EST TOUT. < < CAS DES AUTRES POINTS : < ISOL11: EQU $ CPI 1 < (X,Y) EST-IL 0-ISOLE OU < 1-ISOLE ??? JLE ISOL12 < OUI, ON L'ELIMINE. CPZ PREM < NON, ALORS A-T'ON DEJA < RENCONTRE LE 1ER POINT < DE L'IMAGE ??? JE ISOL7 < OUI, DONC PASSONS AU NEXT. STZ PREM < NON, ON EST DONC ICI < EN PRESENCE DU 1ER POINT, STX DEP+X < QUI RISQUE DE DEVENIR LE STY DEP+Y < FUTUR POINT DE DEPART... JMP ISOL7 < VERS LE POINT SUIVANT... ISOL12: EQU $ BSR ARESET < OUI, ON L'ELIMINE. IC NISOL < ET ON COMPTE LES POINTS < AINSI EFFACES. LR X,A CP DEP+X < EST-ON AU POINT DE DEPART ??? JNE ISOL7 < NON. LR Y,A CP DEP+Y < EST-ON AU POINT DE DEPART ??? JNE ISOL7 < NON. LA POINT1+X < OUI : ON A DONC EFFACE LE STA DEP+X < POINT DE DEPART ELU AU TOUR LA POINT1+Y < PRECEDENT : ON LE REMPLACE STA DEP+Y < PAR UN POINT QUI EST A 1. ISOL7: EQU $ ADRI -1,X < CHANGEMENT DE POINT COURANT. CPZR X < EXISTE-T'IL ??? JGE ISOL2 < OUI. ADRI -1,Y < NON, CHANGEMENT DE LIGNE. LR Y,A < VALIDATION Y. CP YMIN < LIGNE INTERESSANTE ??? JGE ISOL1 < OUI. CPZ NISOL < NON, ON A FINI, ALORS < A-T'ON EFFACE AU MOINS < UN POINT ??? JG ISOL8 < OUI, ALORS ON RECOMMENCE, < CAR CES EFFACEMENTS ONT PU < ENGENDRES DE NOUVEAUX < POINTS 0-ISOLES OU 1-ISOLES. < < RECALAGE DU POINT DE DEPART POUR CHAQUE TOUR : < LAI 1 STA VX < VX=1, STZ VY < VY=0. LX DEP+X < POSITIONNEMENT AU POINT DE LY DEP+Y < DEPART CHOISI. < DE DEPART CHOISI. < < NOTA : < LE POINT DE DEPART CHOISI (DEP), < EST CHOISI A UN ANGLE VERS LA < GAUCHE DU CONTOUR POUR EVITER < DES CISAILLEMENTS EVENTELS DE < CELUI-CI. < < < INITIALISATION DU NOUVEAU PARCOURS : < STZ KOMPT < RAZ DU COMPTEUR DE REM- < PLACANTS OBTENUS LORS DU < PARCOURS AUE L'ON VA FAIRE. STZ SDEP DC SDEP < SDEP<0 : A PRIORI, ON NE < CHANGERA PAS DE POINT DE < DEPART. < < U N T O U R D E R E M P L I S S A G E : < CONT10: EQU $ < < RECHERCHE PRELIMINAIRE DU FUTUR SUCCESSEUR DU POINT COURANT : < STX PTC+X < SAUVEGARDE DU POINT STY PTC+Y < COURANT 'PTC'. LAD PILR STA APILR < INITIALISATION DU POINTEUR < DE LA PILE DES REMPLACANTS. < < TEST A DROITE DU MOUVEMENT : < BSR AROT1 < ROTATION A DROITE. BSR AMOV < DEPLACEMENT VERS LA DROITE. STZ ITEST IC ITEST < POUR LE TEST DES POINTS A 1. BSR AEXIST < EXISTENCE DU POINT A < DROITE DE PTC ??? JAE CONT21 < OK, SUCCESSEUR TROUVE A DROITE. < < TEST DEVANT LE MOUVEMENT : < BSR ASUCC < IL SUFFIT DE TOURNER DE LA < DROITE VERS LA GAUCHE. JAE CONT22 < OK, SUCCESSEUR TROUVE DEVANT. < < TEST A GAUCHE DU MOUVEMENT : < BSR ASUCC < ON TOURNE ENCORE DE LA < DROITE VERS LA GAUCHE. JAE CONT23 < OK, SUCCESSEUR TROUVE A GAUCHE. < < TEST EN ARRIERE DU MOUVEMENT : < BSR ASUCC < DROITE VERS GAUCHE... JAE CONT24 < OK, SUCCESSEUR TROUVE EN ARRIERE. < < CAS OU L'ON RECONTRE UN POINT ISOLE : < IF MODE-VISU,XWOR%7,,XWOR%7 LAD M3 BSR APRINT < ON LE SIGNALE, XWOR%7: VAL 0 BR ALOOP < ET ON RETOURNE A L'INTERPRETEUR... < < CAS OU L'ON SE DEPLACERA A DROITE : < CONT21: EQU $ LAI 4 < AFIN D'ETRE SUR DE REINSERER < PTC DANS LE CAS D'UN VIRAGE < A DROITE... BSR ASAVDP < SAUVEGARDE DU SUCCES- < SEUR DE PTC, ET B=0. BSR AREMPL < REMPLACANT M1 (A GAUCHE < DU SUCCESSEUR 'SUC'). BSR AREMPL < REMPLACANT M2 (EN ARRIERE < DE M1). JMP CONT25 < VERS LE REMPLACANT M3 (A < DROITE DE M2). < < CAS OU L'ON SE DEPLACERA EN AVANT : < CONT22: EQU $ LAI 1 < ON ATTEND 1 REMPLACANT. BSR ASAVDP < SAUVEGARDE DU SUCCESSEUR < DE PTC, ET B=0. CONT25: EQU $ < REMPLACANT M3 (A GAUCHE < DU POINT COURANT 'PTC'). BSR AREMPL < REMPLACANT M3. JMP CONT26 < < CAS OU L'ON SE DEPLACERA A GAUCHE OU EN ARRIERE : < CONT23: EQU $ CONT24: EQU $ LAI 1 < ON FAIT COMME SI L'ON ATTEN- < DAIT 1 POINT, AFIN DE REINSERER < LE POINT COURANT. BSR ASAVDP < SAUVEGARDE DU SUCCESSEUR DE < PTC, ET B=0. < < NOTA : < DANS LE CAS DES DEPLACEMENTS A < GAUCHE, ET EN ARRIERE, ON NE CHERCHE < PAS DE REMPLACANTS, ILS NE SONT < PAS NECESSAIRES, ET ILS RISQUE- < RAIENT DE PERTURBER LA FORME DU CONTOUR !!! < CONT26: EQU $ LR B,A < A=NBRE DE REMPLACANTS AINSI < TROUVES POUR PTC. CP NREMPL < A-T'ON OBTENU CE QU'ON < ATTENDAIT POUR LUI ??? JE CONT27 < OUI, C'EST BOB. LX PTC+X < NON, ALORS, LY PTC+Y < ... BSR ASPILR < PTC EST INSERE DANS PILR. ADRI 1,B < ET ON COMPTE PTC COMME < UN REMPLACANT. < < DEPLACEMENT EFFECTIF SUR LE CONTOUR : < CONT27: EQU $ STB NPILR < NPILR=NBRE DE POINTS EMPILES < DANS PILR ET A MARQUER SUR < LE CONTOUR QUE L'ON GENERE. CONT50: EQU $ DC NPILR < DECPOMPTAGE. JL CONT51 < C'EST FINI... DC APILR < REGRESSION DU POINTEUR DE PILR. LY &APILR DC APILR < REGRESSION DU POINTEUR DE PILR. LX &APILR CONT52: EQU $ BSR ASETV < MARQUAGE VIRTUEL DE (X,Y). IF VERSIO-XXV2,XWOR%8,,XWOR%8 IC NPCN < COMPTAGE DES POINTS DE C(N)... JNE CONT69 < OK... QUIT 1 < PASSAGE PAR 0 !!! CONT69: EQU $ XWOR%8: VAL 0 LA PTC+X CP DEP+X < EST-ON AU POINT DE DEPART ??? JNE CONT50 LA PTC+Y CP DEP+Y < EST-ON AU POINT DE DEPART ??? JNE CONT50 < NON.... STX SDEP+X < SAUVEGARDE DU FUTUR STY SDEP+Y < POINT DE DEPART. JMP CONT50 < AU POINT SUIVANT. CONT51: EQU $ < < RESTAURATION DU VECTEUR DEPLACEMENT MENANT AU SUCCESSEUR : < LA SVX STA VX LA SVY STA VY < < PASSAGE AU SUCCESSEUR : < LX SUC+X LY SUC+Y < < A-T'ON BOUCLE UN TOUR ???? < LR X,A CP DEP+X JNE CONT10 < NON, TRAITEMENT DU SUCCESSEUR... LR Y,A CP DEP+Y JNE CONT10 < NON, TRAITEMENT DU SUCCESSEUR... < < CAS D'UN RETOUR AU POINT DE DEPART : < CONT30: EQU $ < < G E N E R A T I O N D U N O U V E A U < C O N T O U R I N T E R I E U R : < STZ KDIFF < PAS DE DIFFERENCE A PRIORI... CPZ FIRST < EST-CE LE PREMIER CUMUL ??? JE EOR1 < OUI, ON CONSERVE 'IMAGR'... LRM A,B,X < NON, ON RECUPERE LE CUMUL ANTERIEUR : WORD IMAGB < IL EST DANS LE BLEU, WORD IMAGR < ET IL VA DANS LE ROUGE... WORD LIMAG MOVE EOR1: EQU $ IC FIRST < CE N'EST PLUS LA PREMIERE FOIS... LX ALIMAG EOR2: EQU $ ADRI -1,X LA &AIMAGV < ACCES A L'IMAGE VIRTUELLE... LB &AIMAGR < ACCES AU CUMUL COURANT, ORR B,A < ET ON CUMULE... STA &AIMAGR < DANS L'IMAGE COURANTE, STA &AIMAGB < ET DANS L'IMAGE DU CUMUL... CPR A,B < Y-A-T'IL UNE DIFFERENCE ??? JE EOR3 < NON... IC KDIFF < OUI, ON LA COMPTE... EOR3: EQU $ ADRI 1,X JDX EOR2 < AU MOT SUIVANT... LB SDEP+Y < EVENTUEL FUTUR Y(DEP), LA SDEP+X < EVENTUEL FUTUR X(DEP). CPZ SDEP < SDEP EST-IL VALIDE ??? JGE CONT40 < OUI, CHANGEMENT DEP PAR SDEP. WORD '1E16 < E R R E U R P R O G !!! CONT40: EQU $ STA DEP+X STB DEP+Y LA KOMPT < AU COURS DE CE TOUR, UN < REMPLACANT AU MOINS A-T'IL < ETE TROUVE ??? JAG MOOP < OUI, IL FAUT FAIRE UN < NOUVEAU PARCOURS. NLOOP: EQU $ BR ALOOP < NON, L'IMAGE RESIDENTE < ET LE CONTOUR REMPLI ATTEN- < DU, ALORS QUE LA ZONE SCRATCH < CONTIENT LE SQUELETTE. MOOP: EQU $ CPZ KDIFF < Y-A-T'IL EU DES DIFFERENCES ??? JE NLOOP < NON, ON ABANDONNE !!! CP PKOMPT < A-T'ON REMPLACE AUTANT < DE POINTS QU'AU TOUR < PRECEDENT ??? STA PKOMPT < MAJ A PRIORI... JNE LOOP1 < NON, ON VA FAIRE UN < NOUVEAU TOUR... < < CAS OU LE SYSTEME PARAIT OSCILLER : < IC OSCIL < COMPTAGE DE L'OSCILLATION. LA OSCIL CP MOSCIL < ABORT OU PAS ??? JGE NLOOP < OUI, RETOUR A GE. JMP CONT19 < NON, ON ATTEND ENCORE... < < CAS DU FONCTIONNEMENT NORMAL : < LOOP1: EQU $ STZ OSCIL < REINITIALISATION DE OSCIL. CONT19: EQU $ IF VERSIO-XXV2,XWOR%8,,XWOR%8 LA MINX AD PAS JAL ETI1 < 'PAS' DEVIENT MAUVAIS... CPI X20?X21/2 JL ETI2 < 'PAS' EST ENCORE BON... ETI1: EQU $ LA PAS NGR A,A < SI 'PAS' EST MAUVAIS, ON L'INVERSE... STA PAS ETI2: EQU $ < < MODIFICATION DU CADRE DE 'TV2' : < LA MINX AD PAS STA MINX LA MAXX SB PAS STA MAXX LA MINY AD PAS STA MINY LA MAXY SB PAS STA MAXY XWOR%8: VAL 0 BR ACONT8 < VERS UN TOUR DE PLUS. PAGE < < < F I N D E L ' O V E R L A Y : < < XWOR%1: VAL $-DEBOV1*NOCMO LOVL2: EQU ZERO+XWOR%1 IF BUFIN-$,,,XWOR% IF ATTENTION : L'OVERLAY RECOUVRE LA IF ZONE EN RECOUVREMENT DE L'ITEM2 !!! XWOR%: VAL 0 PAGE < < < G E N E R A T I O N E T V A L I D A T I O N : < < XWOR%1: VAL ITEM2-BRANCH IF $-DEBOV1-XWOR%1,XWOR%,, IF ATTENTION : LA BRANCHE D'OVERLAY EST TROP LONGUE !!! XWOR%: VAL 0 EOT #SIP GEN PROCESSEUR#