NMTZ: VAL "KD" NMP: VAL " /" IF NMPROC-NMTZ,,XWOR%, IF NMPROC-NMP,,XWOR%, IF ATTENTION : 'NMPROC' EST MAUVAIS !!! XWOR%: VAL 0 IF NMPROC-NMTZ,XWOR%9,,XWOR%9 IDP "KD - REMPLISSAGE RECURSIF D'UN CONTOUR" XWOR%9: VAL 0 IF NMPROC-NMP,XWOR%9,,XWOR%9 IDP " / - VERSION DE 'KD' INTERPRETATIVE" XWOR%9: VAL 0 IDP "RELEASE 31/05/1984" 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 X20: VAL 1024/DY < NBRE DE LIGNES/IMAGE. X21: VAL CNMPL*16 < NBRE DE POINTS/LIGNE. 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... < < PILE VIRTUELLE DE RECURSIVITE : < SSTACK:: VAL NCOOL*LIMAG+TV2 < ELLE OCCUPE UNE BONNE PARTIE DE 'CDAI'... 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=" MNIVO: BYTE 5;'6D ASCI "NIV=" MK: BYTE 3;'6D ASCI "K=" MASKO: BYTE 9;'6D ASCI "MASK ON?" MSLAS: BYTE 1;"/" MCT: BYTE 1;"=" MN: BYTE 6;'6D ASCI "#PTS=" MP: BYTE 5;'6D ASCI "PAS=" MT: BYTE 6;'6D ASCI "MODE=" M10: BYTE 5;'6D ASCI "RDN=" M11: EQU MSLAS MBORD: BYTE 6;'6D ASCI "BORD=" MCOLOR: BYTE 9;'6D ASCI "COULEUR=" MFOND: BYTE 6;'6D ASCI "FOND=" MTOPO: BYTE 8;'6D ASCI "CONNEX=" 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 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=" AMNIVO: EQU MNIVO < "NIVEAUX=" AMASKO: EQU MASKO < "MASK ON?" AMSLAS: EQU MSLAS < "/" AMK: EQU MK < "K=" 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... APMOV5: WORD PMOV5 < TV R --> RESIDENT, APMOV6: WORD PMOV6 < TV V --> RESIDENT, APMOV7: WORD PMOV7 < TV B --> RESIDENT. 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 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 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 < < 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... < < 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 < < 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 < < DONNEES D'ACCES AU CURSEUR : < CURSOR: BYTE "N";0 < CARACTERE DE DEBLOCAGE DU < CURSEUR (ERREUR A PRIORI). DZS 2 < COORDONNEES Y ET X. NLIN: WORD 1024/DY-1 < NBRE DE LIGNES/IMAGE-1. X: VAL 1 < COORDONNEE X D'UN POINT. Y: VAL 0 < COORDONNEE Y D'UN POINT. C3: WORD 3 < POUR MULTIPLIER C4: WORD 4 < PAR 4/3... 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. ACLIGN: WORD CLIGN < CLIGNOTEMENT D'UN POINT VIDEO... IF MODE-ITEM,XWOR%7,,XWOR%7 ACOORD: WORD COORD < ENTREE D'UNE COORDONNEE 'X' OU 'Y'. XWOR%7: VAL 0 < < DONNEES POUR LE GENERATEUR ALEATOIRE : < MRDN: WORD 0 < MULTIPLICATEUR DU NOMBRE ALEATOIRE, XRDN: WORD 0 < ET DECOMPTEUR DE 'MRDN'... SECRDN: WORD 0 < POUR ATTEINDRE LES SECONDES... RDN7: WORD 793 < DECOMPTEUR D'ACCES A LA SECONDE, RDN8: WORD 1 < VALEUR COURANTE DE 'RDN7'. RDN9: WORD 0 < SECONDE COURANTE... DRDN: WORD 0 < DIVISEUR DU NOMBRE ALEATOIRE... F1: FLOAT 1 RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RDN1: WORD 5189 < CONSTANTE RDN2: WORD 6791 < DE CALCUL DES RDN3:: VAL 19 < NOMBRE ALEATOIRES... RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RDN5: WORD 4021 RDN6:: VAL 23 POINTS: WORD 16807 KRDN1: WORD 0 XKRDN1:: VAL 3 < INCREMENTEUR DE 'KRDN1'. KRDN2: WORD 0 XKRDN2:: VAL 7 < DECOMPTEUR DE 'KRDN2'. ARDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. < < REMPLISSAGE : < AREMP: WORD REMP < SOUS-PROGRAMME RECURSIF DE REMPLISSAGE. NCOLOR: WORD NIVMAX < DEFINITION DU NIVEAU DE REMPLISSAGE. SCOLOR: WORD 0 < NIVEAU D'UN POINT DE DEPART DE COULEUR < DONNEE. IMASKD: WORD 0 < =0 : LE CHOIX DU POINT DE DEPART DANS LES < COMMANDES "R""0...7" EST MASQUABLE, < #1 : CE CHOIX N'EST PAS MASQUABLE... XWOR%1: VAL 0 < INITIALISATION DE LA LISTE DES NIVEAUX, XWOR%2: VAL -1 < POUR DECALER A DROITE... XWOR%3: VAL '8000 < POUR MARQUER LE PREMIER BIT ET DONNE LE < NIVEAU DU NOIR... DO NIVMAX+1 XWOR%1: VAL XWOR%1>XWOR%2?XWOR%3 LNIVI: WORD XWOR%1)MFFFF < LISTE MAXIMALE DES NIVEAUX CONSTITUANT < LE FOND OU LE BORD INVERSE (POUR LES < TESTS DE VALIDATION...). NFOND: WORD XWOR%3 < LISTE DES NIVEAUX CONSTITUANT LE FOND < COURANT (INITIALISE SUR LE NOIR...). XWOR%1: VAL XWOR%3 DO NIVMAX XWOR%1: VAL XWOR%1>XWOR%2 NBORD: WORD XWOR%1 < LISTE DES NIVEAUX CONSTITUANT LE BORD < COURANT (INITIALISE SUR LE BLANC...). NREMP:: VAL 4+4 < ON RECONNAIT JUSQU'A LA 8-CONNEXITE... AINCX: WORD INCX,X < LISTE DES INCREMENTS DE 'X' : INCX: EQU $ WORD 0;-1;0;0;+1;+1;0;0;-1 IF $-INCX-1-NREMP,,XEIF%, IF ATTENTION : LA LONGUEUR DE 'INCX' EST MAUVAISE !!! XEIF%: VAL 0 AINCY: WORD INCY,X < LISTE DES INCREMENTS DE 'Y' : INCY: EQU $ WORD -1;0;+1;+1;0;0;-1;-1;+1 IF $-INCY-1-NREMP,,XEIF%, IF ATTENTION : LA LONGUEUR DE 'INCY' EST MAUVAISE !!! XEIF%: VAL 0 XWOR%1: VAL 0 < INITIALISATION DU CUMUL, XWOR%2: VAL -1 < POUR UN DECALAGE A DROITE, XWOR%3: VAL '8000 < POUR MARQUER LE PREMIER BIT. DO NREMP XWOR%1: VAL XWOR%1>XWOR%2?XWOR%3 XWOR%4: VAL 'AAAA < AFIN D'INITIALISER SUR LA 4-CONNEXION... LVALXY: WORD XWOR%1(XWOR%4 < ON S'INITIALISE SUR LA 8-CONNEXITE, LE < NEUVIEME BIT (A 0) PERMETTANT LE RETOUR < AU POINT DE DEPART... IVALXY: WORD XWOR%1)MFFFF < POUR VALIDER 'LVALXY'... < < GESTION DE LA PILE VIRTUELLE : < KSSTAC: WORD 0 < POINTEUR DE LA PILE VIRTUELLE, ASSTAC: WORD SSTACK < ADRESSE EN 'CDAI' DE LA PILE VIRTUELLE. MSSTAC: WORD 0 < MOT COURANT DE LA PILE VIRTUELLE, AMSSTA: WORD MSSTAC < ET SON ADRESSE... ASPSTA: WORD SPSTAC < SOUS-PROGRAMME DE SIMULATION DES < EMPILEMENTS. < < DONNEES DE PARCOURS < DES SPIRALES : < ASPIR: WORD SPIR < MODULE DE CALCUL DU NIVEAU PONDERE < DU POINT COURANT (XR,YR). PASQ: WORD 0 < PAS DE PARCOURS DE LA SPIRALE. DELTAX: WORD 0 DELTAY: WORD 0 LB: WORD 0 < LONGUEUR DES LB0: WORD 0 < BRANCHES DE LA SPIRALE. MODET: WORD 0 < QUE FAIRE LORS DE LA SORTIE HORS DE < L'INTERVALLE (0,NIVMAX) : < -1 : NIVEAUX<0 --> NOIR, < NIVEAUX>NIVMAX --> NOIR, < 0 : NIVEAUX CALCULES MODULO NIVMAX+1, < +1 : NIVEAUX<0 --> NOIR, < NIVEAUX>NIVMAX --> NIVMAX. NP0:: VAL 1 < NOMBRE DE POINTS INITIAL D'UNE SPIRALE. NPM: WORD NP0 < NOMBRE ENTIER DE POINTS D'UNE SPIRALE, FNP: FLOAT <NP0<0<0 < IDEM EN FLOTTANT... NP: WORD 0 < NOMBRE DE POINTS COURANT D'UNE SPIRALE, < VA DE 1 A (NPM). DCUMUL: EQU FK < NORMALISATEUR DU CUMUL. CUMUL: FLOAT 0 < CUMUL SUR UNE SPIRALE : ON LE CALCULE < PAR : < SIGMA(CT(X)*NIVEAU(X)). NCT:: VAL '09 < NOMBRE DE CONSTANTES DE TRAVAIL. ACT: WORD CT,X < ACCES AUX CONSTANTES DE TRAVAIL. CT: EQU $ DO NCT FLOAT 1 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 R+V+B WORD GTV2 < 9 : RESIDENT <-- TV2 R+V+B WORD ERROR < : WORD ERROR < ; WORD ERROR < < WORD DSPIR < = : DEFINITION DES SPIRALES WORD ERROR < > WORD TRAME < ? : ENTREE DE LA TRAME "ALEATOIRE" WORD ERROR < @ WORD GCT < A : ENTREE DES CONSTANTES DE TRAVAIL WORD BORD < B : ENTREE DU "BORD" DU CONTOUR WORD COLOR < C : ENTREE DE LA "COULEUR" DE REMPLISSAGE WORD DISP < D : RESIDENT <-- IMAGE SGN WORD ERROR < E WORD GOGE < F : FIN WORD FOND < G : ENTREE DU FOND OU "GROUND" WORD ERROR < H WORD ERROR < I WORD ERROR < J WORD INFK < K : ENTREE CTTE TRANSFORMATION WORD ERROR < L WORD PMASKD < M : BASCULE DE 'IMASKD'. WORD NAME < N : NOMME L'IMAGE RESIDENTE WORD ERROR < O WORD ERROR < P WORD ERROR < Q WORD CONTO < R : REMPLISSAGE WORD ERROR < S WORD TOPOLO < T : ENTREE DES CONNEXITES WORD ERROR < U WORD ERROR < V WORD GOCCI < W : RETOUR TEMPORAIRE AU CCI WORD ERROR < X WORD ERROR < Y 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 WORD COMON+128 < C=BASE DU COMMON... STZ XCTCDA < AU CAS OU UN MALHEUREUX ALT-MODE... < INUTILE EN FAIT ICI... 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... LAI NSPDAT SBT 0 ACTD 1 < B=ADRESSE DE LA DATE, ADRI 5,B STB SECRDN < ADRESSE DES SECONDES... 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 < < < 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 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 L I G N O T E M E N T D ' U N P O I N T : < < < ARGUMENT : < (X,Y)=POINT COURANT. < < CLIGN: EQU $ PSR A,B,X,Y STX XR < ON SE PLACE STY YR STX XS STY YS < AU POINT COURANT... BSR ASPGPS < (A)=NIVEAU(X,Y)... PSR A < AND SAVE IT... LXI 4 < (X)=NOMBRE DE CLIGNOTEMENTS... CLIGN1: EQU $ PSR X LAI NIVMAX < ON AFFICHE UN POINT BLANC, BSR ASPRPS < ET ON VISUALISE... LXI 0 CLIGN2: EQU $ HALT < ON ATTEND UN PEU... CPZR X JNE CLIGN2 LAI NIVMAX)NIVMAX < ON AFFICHE UN POINT NOIR, BSR ASPRPS < ET ON VISUALISE... LXI 0 CLIGN3: EQU $ HALT < ET ON ATTEND UN PEU... CPZR X JNE CLIGN3 PLR X JDX CLIGN1 < ET ON RECOMMENCE... PLR A BSR ASPRPS < PUIS ON RESTAURE LE POINT COURANT... PLR A,B,X,Y 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 < < < G E N E R A T E U R A L E A T O I R E : < < < ARGUMENT : < (X,Y)=COORDONNEES X ET Y DU POINT COURANT... < < SPRDN: EQU $ PSR B LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA KRDN1 ADRI XKRDN1,A SCRS XKRDN2 STA KRDN1 < PROGRESSION DE 'KRDN1'... SPMOYC: EQU $ EORR X,A EOR XRDN STA RDN DC RDN8 LA RDN9 < A=RDN9 A PRIORI... JNE SPRDN1 < ET BIEN OUI... CE N'EST PAS L'HEURE... LA RDN7 < C'EST L'HEURE D'ALLER CHERCHER STA RDN8 < LA SECONDE COURANTE ??!?!??! LA SECRDN ACTD 1 < B=SECONDE COURANTE, LR B,A STA RDN9 < ET MEMORISATION... SPRDN1: EQU $ EOR RDN STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA KRDN2 ADRI -XKRDN2,A SCRS XKRDN1 STA KRDN2 < PROGRESSION DE 'KRDN2'... SPMOYF: EQU $ EORR Y,A STA RDN4 EOR RDN PLR B RSR PAGE 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... JE INFK < 'K' DOIT ETRE NON NULLE... FST FK < OK... BR ALOOP 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 < < < 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 < < < 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 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 < < < B A S C U L E D E ' I M A S K D ' : < < PMASKD: EQU $ LA IMASKD IBT NBITMO-1 STA IMASKD < ET VOILA LA BASCULE... BR ALOOP < ET C'EST TOUT... PAGE < < < E N T R E E D ' U N E C O N S T A N T E < D E T R A V A I L : < < GCT: EQU $ BSR AIHEX < ENTREE DU NUMERO : JNE GCT < ERREUR... JAL GCT < ERREUR... CPI NCT JGE GCT < ERREUR... ADR A,A LR A,X < X=INDEX DOUBLE-MOT DE LA CONSTANTE... IF MODE-VISU,XWOR%7,,XWOR%7 LAI MCT-ZERO XWOR%7: VAL 0 BSR AIFLOT < ENTREE DE LA CONSTANTE... FST &ACT < ET MEMORISATION... BR ALOOP PAGE < < < D E F I N I T I O N D E L A S P I R A L E : < < DSPIR: EQU $ < < NOMBRE DE POINTS : < DSPIR1: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MN-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE D'UN NOMBRE HEXA-DECIMAL : JNE DSPIR1 < ERREUR DE SYNTAXE... JALE DSPIR1 < ERREUR... CPI NCT JG DSPIR1 < ERREUR... STA NPM < OK, ON LE MEMORISE EN ENTIER, FLT FST FNP < ET EN FLOTTANT... < < PAS DE PARCOURS : < DSPIR2: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MP-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE D'UN NOMBRE HEXA-DECIMAL : JNE DSPIR2 < ERREUR DE SYNTAXE... JALE DSPIR2 < ERREUR... STA PASQ < TOUT NOMBRE POSITIF EST ACCEPTE... < < "MODE DE TRACE" : < DSPIR3: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MT-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE D'UN NOMBRE HEXA-DECIMAL : JNE DSPIR3 < ERREUR DE SYNTAXE... CPI 1 < ET VALIDATION... JE DSPIR4 < OK... CPI -1 JE DSPIR4 < OK... JANE DSPIR3 < ERREUR... DSPIR4: EQU $ STA MODET < OK (-1,0,+1)... < < FIN DE DEFINITION DE LA SPIRALE : < BR ALOOP < VERS LA BOUCLE DE L'INTERPRETEUR. PAGE < < < E N T R E E D U T R A M A G E : < < TRAME: EQU $ ERDN1: EQU $ STZ DRDN STZ MRDN < PAS D'ALEATOIRE A PRIORI... IF MODE-VISU,XWOR%7,,XWOR%7 LAI M10-ZERO BSR APRINT < EDITION DU MESSAGE... XWOR%7: VAL 0 BSR AIHEX < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION. JNE ERDN1 < ERREUR... JAE ERDN6 < PAS D'ALEATOIRE... (MRDN=DRDN=0) STA MRDN < MULTIPLICATEUR, IF MODE-VISU,XWOR%7,,XWOR%7 LAI M11-ZERO BSR APRINT < EDITION DU MESSAGE... XWOR%7: VAL 0 BSR AIHEX < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION. JNE ERDN1 < ERREUR... STA DRDN < ET DIVISEUR : < ON RENTRE UN NOMBRE COMPRIS ENTRE < 1 ET 255 ; LORSQUE LE NOMBRE ALEATOIRE < CALCULE EST DIVISIBLE PAR 'DRDN', ON < TRACE LE POINT COURANT PAR 'SETV' ; < LORSQUE DRDN=1, TOUS LES POINTS SONT < TRACES... CP MRDN JL ERDN1 < IL FAUT M<=D... ERDN6: EQU $ < NOTA : DRDN=0 EQUIVAUT A DRDN=1... BR ALOOP < ET VERS L'INTERPRETEUR... PAGE < < < D E F I N I T I O N D U B O R D : < < BORD: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MBORD-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION. JNE BORD < ERREUR DE SYNTAXE... JAE BORD < ERREUR : IL FAUT AU MOINS UN NIVEAU... LB LNIVI < ACCES A LA LISTE MAXIMALE INVERSEE, ANDR A,B CPZR B < Y-A-T'IL DES NIVEAUX INEXISTANTS ??? JNE BORD < OUI, ERREUR... STA NBORD < ET MEMORISATION DE LA LISTE... BR ALOOP < VERS LA BOUCLE DE L'INTERPRETEUR... PAGE < < < D E F I N I T I O N D E L A C O U L E U R < D E R E M P L I S S A G E : < < COLOR: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MCOLOR-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION. JNE COLOR < ERREUR DE SYNTAXE... JAL COLOR < ERREUR DE NIVEAU... CPI NIVMAX JG COLOR < ERREUR DE NIVEAU... STA NCOLOR < ET MEMORISATION... BR ALOOP < VERS LA BOUCLE DE L'INTERPRETEUR... PAGE < < < D E F I N I T I O N D U F O N D : < < FOND: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MFOND-ZERO BSR APRINT XWOR%7: VAL 0 BSR AIHEX < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION. JNE FOND < ERREUR DE SYNTAXE... JAE FOND < ERREUR : IL FAUT AU MOINS UN NIVEAU... LB LNIVI < ACCES A LA LISTE MAXIMALE INVERSEE, ANDR A,B CPZR B < Y-A-T'IL DES NIVEAUX INEXISTANTS ??? JNE FOND < OUI, ERREUR... STA NFOND < ET MEMORISATION DE LA LISTE... BR ALOOP < VERS LA BOUCLE DE L'INTERPRETEUR... PAGE < < < D E F I N I T I O N D E L A C O N N E X I T E : < < < NOTA : < 'AA00 : 4-CONNEXITE HORIZONTALE-VERTICALE, < '5500 : 4-CONNEXITE DIAGONALE, < 'FF00 : 8-CONNEXITE. < < TOPOLO: EQU $ IF MODE-VISU,XWOR%7,,XWOR%7 LAI MTOPO-ZERO BSR APRINT < ENVOI D'UN MESSAGE, XWOR%7: VAL 0 BSR AIHEX < ENTREE DE LA CONNEXITE : JNE TOPOLO < ERREUR DE SYNTAXE... JAE TOPOLO < ERREUR : IL FAUT AU MOINS UN LIEN... LB IVALXY < POUR VALIDER (A) : ANDR A,B CPZR B < ALORS ??? JNE TOPOLO < ERREUR : LIENS INCONNUS... STA LVALXY < ET MEMORISATION DE LA LISTE DES < LIENS (DANS LE SENS TRIGONOMETRIQUE). BR ALOOP < VERS LA BOUCLE D'INTERPRETATION... PAGE < < < R E M P L I S S A G E D ' U N C O N T O U R : < < CONTO: EQU $ < < 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-ITEM,XWOR%7,,XWOR%7 BSR AIN < (A)=COMMANDE "R" OU "0"..."7". XWOR%7: VAL 0 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). MP C4 < POUR ATTEINDRE DV C3 < TOUTE LA VIDEO... 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, < R : ENTREE DU POINT DE DEPART ET "REMPLISSAGE", < 0-7 : ENTREE DE LA COULEUR DU POINT DE DEPART (ON < PARTIRA DU PREMIER POINT RENCONTRE PAR BALA- < YAGE RASTER POSSEDANT CETTE COULEUR). < CPI "C" JE CUR1 < CLIGNOTEMENT SEUL... XWOR%7: VAL 0 CPI "0" JL CUR1 < ERREUR... CPI NIVMAX='FA00('00FF JLE CUR2 < DEPART SUR UN POINT DE COULEUR DONNEE... CPI "R" JNE CUR1 < RIEN COMPRIS, ON RECOMMENCE. IF MODE-ITEM,XWOR%7,,XWOR%7 < < 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 $ STZ KSSTAC < REINITIALISATION A PRIORI DU POINTEUR < DE LA PILE VIRTUELLE... BSR AREMP < REMPLISSAGE DE (X,Y). < < FIN DE REMPLISSAGE : < CUR4: EQU $ BR ALOOP < VERS LA BOUCLE DE L'INTERPRETEUR... < < RECHERCHE D'UN POINT DE < DEPART, QUI EST LE PRE- < MIER POINT D'UNE COULEUR < DONNEE EN ARGUMENT : < CUR2: EQU $ ADRI -"0",A < CONVERSION EN UN NIVEAU... STA SCOLOR < (A)=COULEUR DU POINT DE DEPART CHERCHE. LYI 0 < Y=ORDONNEE. STY YR CUR11: EQU $ LXI 0 STX XR < X=ABSCISSE. CUR12: EQU $ CPZ IMASKD < LE CHOIX EST-IL MASQUABLE ??? JNE CUR18 < NON, ALLONS TESTER... CPZ IMASKO JE CUR18 < 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 CUR15 < LE MOT (X,Y) EST MASQUE... CUR18: EQU $ BSR ASPGPR < (A)=NIVEAU(XR,YR) : CP SCOLOR < EST-CE LA COULEUR CHERCHEE ??? JNE CUR13 < NON... LA NFOND < OUI : ON VA S'ARRETER ICI, MAIS < AU PREALABLE, ON VA LUI METTRE < UNE DES COULEURS DU FOND... DBT < RECHERCHE DE LA PREMIERE COULEUR < APPARTENANT AU FOND, LR X,A BSR ASPRPR < QUE L'ON DONNE A (XR,YR)... LX XR < ET ON SE POSITIONNE LY YR < SUR CE POINT DE DEPART... JMP CUR3 < ET C'EST PARTI... CUR13: EQU $ CUR15: EQU $ IC XR < ET DE XR, LA XR CPI NPOLM1 < EST-ON EN BOUT DE LIGNE ??? JLE CUR12 < NON... BALAYAGE HORIZONTAL... IC YR < OUI : PROGRESSION DE 'YR'... LA YR CPI NLIGM1 < EST-ON EN BOUT D'IMAGE ??? JLE CUR11 < NON, BALAYAGE VERTICAL... JMP CUR4 < OUI : ON N'A PAS TROUVE DE POINT < DE DEPART DE LA COULEUR ARGUMENT, < ON ABANDONNE DONC... PAGE < < < R E M P L I S S A G E R E C U R S I F : < < < FONCTION : < CE MODULE TESTE LE POINT < ARGUMENT (X,Y) ; S'IL APPAR- < TIENT AU FOND RESIDENT, IL EST < MARQUE EN RESIDENT ET ALEATOIRE- < MENT EN SCRACTH AFIN DE CREER < UNE TRAME. ON EST OBLIGE DE < MARQUER LE RESIDENT, CAR EN < EFFET LA TRAME ALEATOIRE DU < SCRATCH EST TROUEE, ET LE TEST < D'APPARTENANCE AU FOND S'Y < PERDRAIT... < < < ARGUMENT : < (X,Y)=POINT COURANT. < < REMP: EQU $ < < TEST DES OVER-SCREEN : < LR X,A < TEST DE 'X' : JAL REMP1 < HORS-ECRAN : ARRET DE LA RECURSIVITE... CPI NPOLM1 JG REMP1 < HORS-ECRAN : ARRET DE LA RECURSIVITE... LR Y,A < TEST DE 'Y' : JAL REMP1 < HORS-ECRAN : ARRET DE LA RECURSIVITE... CPI NLIGM1 JG REMP1 < HORS-ECRAN : ARRET DE LA RECURSIVITE... < < ACCES A UNE VALEUR "PONDEREE" < EN SPIRALE DU POINT (X,Y) : < STX XR STY YR BSR ASPGPR < (A)=NIVEAU(XR,YR), CP NCOLOR < LE POINT (XR,YR) EST-IL DEJA MARQUE ??? JE REMP1 < OUI, ON L'IGNORE, ET ON ARRETE ICI LA < RECURSIVITE... LR A,B < NON : < (B)=NIVEAU(XR,YR)... PSR A < SAVE LE NIVEAU REEL DE (XR,YR)... LA NPM CPI NP0 < LA SPIRALE FAIT-ELLE 1 POINT ??? JE REMP20 < OUI, (A) EST BON... BSR ASPIR < NON, ALLONS SOMMER AUTOUR DE (XR,YR) < DANS L'IMAGE 'TV2'... LR A,B < (B)=NIVEAU PONDERE AUTOUR DE (XR,YR), < LE POINT (XR,YR) Y COMPRIS. REMP20: EQU $ PLR A < (A)=NIVEAU REEL DE (XR,YR)... PSR X < SAVE LA COORDONNEE 'X', LR A,X < (X)=NIVEAU(XR,YR), LA NBORD TBT 0,X < LE POINT (X,Y) APPARTIENT-IL AU BORD ??? PLR X < RESTAURATION DE LA COORDONNEE 'X'... JC REMP1 < OUI, ON ARRETE LA RECURSIVITE... < < CAS D'UN POINT QUI N'EST < PAS AU BORD : < LA NCOLOR < (A)=COULEUR DE REMPLISSAGE... BSR ASPRPR < ON MARQUE TOUT POINT QUI N'APPARTIENT < AU BORD, AFIN DE NE PAS PERTURBER LA < RECURSIVITE A CAUSE : < 1 - DU TRAMAGE (QUI CREE DES TROUS) DU < SCARTCH, < 2 - DES CAS OU LES LISTES DU 'BORD' < ET DU 'FOND' NE SONT PAS COMPLEMENTAIRES, < CE QUI CREE DES TROUS AUSSI... PSR X < SAVE LA COORDONNEE 'X' : LR B,X < (X)=NIVEAU(XR,YR), LA NFOND TBT 0,X < LE POINT (X,Y) APPARTIENT-IL AU FOND ??? PLR X < RESTAURATION DE LA COORDONNEE 'X'... JNC REMP2 < NON, ON L'IGNORE ET ON PASSE AUX POINTS < VOISIN ORTHOGONALEMENT... < < UTILISATION DU MASQUE : < CPZ IMASKO JE REMP8 < LE MASQUE EST OFF... PSR X,Y < LE MASQUE EST ON : < (X,Y)=COORDONNEES 'X' ET 'Y' DU POINT < COURANT. 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 REMP2 < LE MOT (X,Y) EST MASQUE, ON L'IGNORE, ET < ON PASSE A SES VOISINS... REMP8: EQU $ < < CAS D'UN POINT QUI EST < SUR LE FOND ET NON MASQUE : < LA DRDN CPI 1 JLE REMP3 < DANS CE CAS, ON TRACE SYSTEMATIQUEMENT... < (POUR DRDN=1, ON TROUVERAIT TOUJOURS UN < NOMBRE DIVISIBLE PAR 1...) LA MRDN STA XRDN < INITIALISATION DU MULTIPLICATEUR < COURANT... REMP5: EQU $ BSR ARDN < CALCUL D'UN NOMBRE ALEATOIRE, SARD NBITMO DV DRDN CPZR B < EST-IL DIVISIBLE PAR 'DRDN' ??? JE REMP4 < OUI, ON LE TRACE... DC XRDN < NON, ITERONS SUR 'RDN' : JG REMP5 < OUI... JMP REMP6 < NON, ON NE TRACE DONC PAS CE POINT... REMP4: EQU $ REMP3: EQU $ < < GENERATION DE LA TRAME : < STX XS STY YS LA NCOLOR < (A)=COULEUR DE REMPLISSAGE, BSR ASPRPS < ET MARQUAGE DU POINT (XS,YS)... REMP6: EQU $ < < ACCES AUX 4-VOISINS : < REMP2: EQU $ LAI 0 < (A)=NUMERO DU VOISIN COURANT, SACHANT < QUE L'ON VA DANS LE SENS TRIGONO- < METRIQUE... REMP30: EQU $ XR A,X < (X)=INDEX DES LISTES D'INCREMENT. AD &AINCX < MODIFICATION DE LA COORDONNEE 'X', XR A,Y AD &AINCY < MODIFICATION DE LA COORDONNEE 'Y', XR A,Y LB LVALXY < (B)=LISTE DE VALIDATION DES VOISINS... TBT NBITMO,X < LE VOISIN COURANT EST-IL A TESTER ??? XR A,X < RESTAURE : < (A)=NUMERO DE VOISIN COURANT, < (X,Y)=COORDONNEE DE CELUI-CI... JNC REMP31 < NON, ON PASSE AU SUIVANT... BSR ASPSTA < OUI, ON LE PREND EN COMPTE, JMP REMP < ET ON VA LE TRAITER... REMP31: EQU $ ADRI 1,A < PASSAGE AU VOISIN SUIVANT... CPI NREMP+1 < EST-CE FINI ??? < (ON FAIT +1, AFIN DE REVENIR SUR LE < POINT CENTRAL...) JL REMP30 < NON, PASSAGE AU VOISIN SUIVANT (OU < RETOUR AU POINT CENTRAL)... DREMP:: VAL NREMP=0 < ET DECALAGE D'ACCES... IF NBITMO/DREMP(0='FD00,,XEIF%, DREMP: VAL DREMP+1 < RECHERCHE D'UN DIVISEUR DE 'NBITMO'... XEIF%: VAL 0 IF NBITMO/DREMP(0='FD00,,XEIF%, IF ATTENTION : 'DREMP' EST MAUVAIS !!! XEIF%: VAL 0 XWOR%1: VAL NLIG < NOMBRE DE LIGNES, XWOR%2: VAL NPOLM1+1 < NOMBRE DE POINTS, XWOR%3: VAL NBITMO/DREMP < NOMBRE D'APPELS MEMORISES DANS UN MOT. XWOR%4: VAL XWOR%1/XWOR%3*XWOR%2 < NOMBRE DE MOTS NECESSAIRES POUR UN < MAXIMU D'APPELS (TOUS LES POINTS). XWOR%5: VAL SSTACK+XWOR%4 < TOP DE LA PILE VIRTUELLE... < < FIN DE LA RECURSIVITE : < REMP1: EQU $ LA KSSTAC < (A)=POINTEUR COURANT DE LA PILE : JAE REMP9 < C'EST FINI... ON RETOURNE A L'APPELANT... DC KSSTAC < NON, ON DEPILE DONC... PSR X < SAUVEGARDES... LBI 0 < CLEAR 'B' (SUITE DU SUPER-BUG...). SLRD NBITMO/DREMP=0 < DECONCATENATION : < (A)=ADRESSE RELATIVE DANS LA PILE, < (B)=NUMERO DE ZONE, AD ASSTAC < (A)=ADRESSE ABSOLUE EN 'CDAI', PSR B LB AMSSTA < (B)=ADRESSE DE RECEPTION, LXI 1 < (X)=NOMBRE DE MOTS A DEPLACER. RCDA PLR B < RESTAURATION DU NUMERO DE ZONE, LAI 0 SLLD NBITMO=0 < QUE L'ON CONVERTIT EN UN DECALAGE... LR A,X LA MSSTAC < (A)=MOT COURANT DE LA PILE, SCLS DREMP,X < QUE L'ON CADRE, ANDI BIT>DREMP-BIT < ET CE QUI NOUS DONNE LE NUMERO DE < L'APPEL DU TYPE "XREMP..." : < D'OU LES RETOURS SIMULES... PLR X CPI NREMP < VALIDATION... JL REMP31 < OK, AU VOISIN SUIVANT... QUIT 1 < E R R E U R P R O G R A M M E ... REMP9: EQU $ RSR < RETOUR REEL A L'APPELANT... PAGE < < < E X P L O R A T I O N D ' U N E S P I R A L E : < < < FONCTION : < CE MODULE ICI A CAUSE DES < SAUTS SUPERIEURS A 128 MOTS < PERMET DE CALCULER LE NIVEAU < PONDERE PAR LES COEFFICIENTS < 'A' AUTOUR DU POINT COURANT. < MAIS, ATTENTION, LE NIVEAU < PONDERE EST CALCULE A PARTIR < DE 'TV2' QUE L'ON SUPPOSE < INITIALEMENT IDENTIQUE A < L'IMAGE CONTENUE DANS 'TV1' ; < LA DIFFERENCE ENTRE LES 2 EST < QUE 'TV1' VA ETRE MODIFIE AU < COURS DE L'OPERATION, ALORS < QUE 'TV2' RESTE INTACTE... < < < ARGUMENTS : < (X,Y)=POINT COURANT. < < < RESULTAT : < (A)=NIVEAU PONDERE (0-7). < < SPIR: EQU $ PSR B,X,Y < < INITIALISATION DE LA SPIRALE : < LA XR LB YR PSR A,B < SAUVEGARDE DU POINT (XR,YR). FLD F0 FST CUMUL < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASQ STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI 1 STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIRALE. SPMOY8: EQU $ < < PARCOURS D'UN BRAS : < SPMOY1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPMOY2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NPM < FINI ??? JG SPMOY3 < OUI... LA XR < NON : JAL SPMOY4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPMOY4 < HORS-ECRAN... LA YR JAL SPMOY4 < HORS-ECRAN... CPI NLIGM1 JG SPMOY4 < HORS-ECRAN... LA XR LB YR STA XS STB YS < (XS,YS) <-- (XR,YR) COURANT. LA CTCDA STA XCTCDA < AFIN D'ACCEDER A 'TV2'... BSR ASPGPS < (A)=NIVEAU(XS,YS) DANS 'TV2'. STZ XCTCDA < ET RETOUR A 'TV1'... FLT < NIVEAU DU POINT COURANT, LX NP < (X)=NUMERO DU POINT COURANT (DE 1 A NPM), ADRI -1,X < POUR COMMENCER A 0... ADR X,X < POUR OBTENIR UN INDEX FLOTTANT... FMP &ACT < ET ON PONDERE LE NIVEAU PAR CT(X), FAD CUMUL FST CUMUL < PUIS ON CUMULE... SPMOY4: EQU $ LA XR AD DELTAX < CHANGEMENT DE STA XR LA YR AD DELTAY < POINT COURANT (XS,YS). STA YR DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPMOY2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPMOY5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPMOY5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPMOY1 < VERS LA BRANCHE SUIVANTE < < GENERATION DU NIVEAU "PONDERE" < DU POINT (X,Y)=(XR,YR) : < SPMOY3: EQU $ PLR A,B STA XR < RESTAURATION DE STB YR < (XR,YR)... FLD CUMUL < VALEUR DU SIGMA, FDV FNP < NORMALISATION, FDV DCUMUL < ET REDUCTION EVENTUELLE PAR 'K'... BSR AROND CPZ MODET < QUEL EST LE MODE DE TRACE ??? JNE SPMOY6 < PAR SEUILLAGE... ANDI NIVMAX < PAR MODULO... JMP SPMOY7 < VERS LA GENERATION... SPMOY6: EQU $ JAG SPMOY9 < LE NIVEAU N'EST PAS NOIR... LAI 0 < NOIR, OU NEGATIF --> NOIR... JMP SPMOY7 < VERS LE TRACE... SPMOY9: EQU $ CPI NIVMAX JLE SPMOY7 < ON EST DANS L'INTERVALLE (0,NIVMAX)... CPZ MODET < HORS DE CET INTERVALLE, QUEL EST LE < MODE DE TRACE ??? LAI 0 < A PRIORI : NIVEAU>NIVMAX --> NOIR... JL SPMOY7 < ET OUI, VERS LA GENERATION... LAI NIVMAX < ET NON : NIVEAU>NIVMAX --> NIVMAX... SPMOY7: EQU $ < < RETOUR : < PLR B,X,Y RSR PAGE < < < S I M U L A T I O N D E S ' B S R ' : < < < FONCTION : < EN EFFET, LA PILE RESIDENTE < NE SUFFIT PAS : ON DOIT DONC < SIMULER LES 'BSR' RECURSIFS < DANS UNE PILE DANS LAQUELLE ON < PLACE DES NUMEROS D'APPELS LES < PLUS PETITS POSSIBLES ("XREMP..."). < < < ARGUMENT : < (A)=NUMERO D'APPEL ("XREMP..."). < < SPSTAC: EQU $ CPI BIT>DREMP-BIT < VALIDATION : JLE SPSTA2 < OK... QUIT 1 < E R R E U R P R O G R A M M E ... SPSTA2: EQU $ < < PROGRESSION DU POINTEUR DE PILE : < IC KSSTAC < LE PSEUDO-POINTEUR PROGRESSE : JNE SPSTA1 < OK... QUIT 1 < LORSQU'IL REPASSE PAR 0, IL Y A DEBOR- < DEMENT DE LA PILE VIRTUELLE... SPSTA1: EQU $ < < ACCES A L'ENTREE-MOT < COURANTE : < PSR A,B,X,Y LR A,Y < (Y)=NUMERO D'APPEL... LA KSSTAC < (A)=PSEUDO-POINTEUR COURANT : LBI 0 < CLEAR 'B' (OUFFF... BUG PAS FACILE !!!). SLRD NBITMO/DREMP=0 < QUE L'ON DECONCATENE : < (A)=ADRESSE RELATIVE EN 'CDAI', < (B)=NUMERO DE ZONE. AD ASSTAC < (A)=ADRESSE ABSOLUE EN 'CDAI', PSR A < QUE L'ON MEMORISE... STZ MSSTAC < A PRIORI (AU CAS OU (B)=0)... CPZR B < EST-CE LA PREMIERE ZONE D'UN MOT QUE < L'ON VA ECRIRE ??? JE SPSTA3 < OUI, PAS DE 'RCDA', AINSI : CELA VA UN < PEU PLUS VITE, MAIS SURTOUT, ON EVITE DES < PARITES MEMOIRE AU CAS OU LA 'CDAI' < AURAIT ETE MISE HORS-TENSION... PSR B < SAUVEGARDE DU NUMERO DE ZONE. LB AMSSTA < (B)=ADRESSE DU MOT COURANT EN RESIDENT, LXI 1 < (X)=NOMBRE DE MOTS A DEPLACER, RCDA < ACCES A L'ENTREE COURANTE... < < MISE EN PLACE DU < NUMERO D'APPEL : < PLR B < (B)=NUMERO DE ZONE : SPSTA3: EQU $ LAI 0 SLLD NBITMO=0 < QUE L'ON CONVERTIT EN UN DECALAGE : LR A,X LA MSSTAC < (A)=MOT COURANT DE LA PILE : SCLS DREMP,X < CADRAGE DE LA ZONE COURANTE, ANDI BIT>DREMP-BIT)MFFFF < ET NETTOYAGE, ORR Y,A < PUIS INSERTION DU NUMERO D'APPEL... SCRS DREMP,X < ET RECALAGE... STA MSSTAC < < MISE A JOUR DE LA PILE : < PLR A < (A)=ADRESSE ABSOLUE EN 'CDAI', LB AMSSTA < (B)=ADRESSE EN RESIDENT, LXI 1 < (X)=NOMBRE DE MOTS A DEPLACER, WCDA < MISE A JOUR DE LA PILE... < < ET RETOUR : < PLR A,B,X,Y RSR PAGE < < < V A L I D A T I O N D U F O R M A T D E L ' I M A G E : < < IF X20-X21,,X100, IF ATTENTION : L'IMAGE N'EST PAS CARREE !!! X100: 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 PILE-LTNI-LTNI XWOR%2: VAL $-ZERO IF XWOR%2-XWOR%1,XWOR%,, IF ATTENTION : TROP LONG !!! XWOR%: VAL 0 DZS XWOR%1-XWOR%2+1 < NETTOYAGE... EOT #SIP GEN PROCESSEUR#