DF'SIOT CONFORME 1' ED'SIOT CONFORME 1' IN0 PAGE IDP "SIOT CONFORME 1" IF NMPROC-" +",,XWOR%, $EQU $-32 < A T T E N T I O N... IDP "ATTENTION : EST EN RECOUVREMENT DE -32 MOTS !!!" XWOR%: VAL 0 < < < T R A N S F O R M A T I O N S C O N F O R M E S 1 : < < < FONCTION : < CE MODULE CALCULE LA TRANS- < FORMATION SUIVANTE (DONT LES < TRANSFORMATIONS Z2 ET 1/Z SONT < DES CAS PARTICULIERS) : < < X=(A0*X+A1*X**2+A2*X*Y+A3*Y**2+A4*Y)/D, < Y=(A5*X+A6*X**2+A7*X*Y+A8*Y**2+A9*Y)/D, < Z=0, < AVEC : < D=A10+A11*X+A12*X**2+A13*X*Y+A14*Y**2+A15*Y. < < < TRANSFORMATION CONFORME : Z=Z**2 : < A1=1, < A3=-1, < A7=2, < A10=1. < (TOUS LES AUTRES A(I) ETANT NULS). < < < TRANSFORMATION CONFORME : Z=1/Z : < A0=1, < A9=-1, < A12=1, < A14=1. < (TOUS LES AUTRES A(I) ETANT NULS). < < < PARAMETRES : A0:: VAL 0 < COEFFICIENTS DU NUMERATEUR DE 'X' : A1:: VAL A0+1 A2:: VAL A1+1 A3:: VAL A2+1 A4:: VAL A3+1 A5:: VAL A4+1 < COEFFICIENTS DU NUMERATEUR DE 'Y' : A6:: VAL A5+1 A7:: VAL A6+1 A8:: VAL A7+1 A9:: VAL A8+1 A10:: VAL A9+1 < COEFFICIENTS DU DENOMINATEUR DE X ET Y : A11:: VAL A10+1 A12:: VAL A11+1 A13:: VAL A12+1 A14:: VAL A13+1 A15:: VAL A14+1 < < < L O C A L : < < LOCAL FLOC: EQU $ XA0: FLOAT 0 XA1: FLOAT 0 XA2: FLOAT 0 XA3: FLOAT 0 XA4: FLOAT 0 XA5: FLOAT 0 XA6: FLOAT 0 XA7: FLOAT 0 XA8: FLOAT 0 XA9: FLOAT 0 XA10: FLOAT 0 XA11: FLOAT 0 XA12: FLOAT 0 XA13: FLOAT 0 XA14: FLOAT 0 XA15: FLOAT 0 DENOM: FLOAT 0 ASPAD: WORD SPAD < S/P DE CUMUL DE 'FWORK'... PROG < < < C U M U L : < < SPAD: EQU $ FAD FWORK FST FWORK RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < RECUPERATION DES PARAMETRES : < LXI A0 BSR ASPCT FST XA0 LXI A1 BSR ASPCT FST XA1 LXI A2 BSR ASPCT FST XA2 LXI A3 BSR ASPCT FST XA3 LXI A4 BSR ASPCT FST XA4 LXI A5 BSR ASPCT FST XA5 LXI A6 BSR ASPCT FST XA6 LXI A7 BSR ASPCT FST XA7 LXI A8 BSR ASPCT FST XA8 LXI A9 BSR ASPCT FST XA9 LXI A10 BSR ASPCT FST XA10 LXI A11 BSR ASPCT FST XA11 LXI A12 BSR ASPCT FST XA12 LXI A13 BSR ASPCT FST XA13 LXI A14 BSR ASPCT FST XA14 LXI A15 BSR ASPCT FST XA15 < < CALCUL DU DENOMINATEUR : < FLD VARV FMP XA15 < A15*Y, FST FWORK FLD VARV FMP VARV FMP XA14 BSR ASPAD < +A14*Y**2, FLD VARV FMP VARU FMP XA13 BSR ASPAD < +A13*X*Y, FLD VARU FMP VARU FMP XA12 BSR ASPAD < +A12*X**2, FLD VARU FMP XA11 BSR ASPAD < +A11*X, FAD XA10 < +A10, FST DENOM < DENOMINATEUR DE 'X' ET 'Y'. < < CALCUL DE 'X' : < FLD VARV FMP XA4 FST FWORK < A4*Y, FLD VARV FMP VARV FMP XA3 BSR ASPAD < +A3*Y**2, FLD VARV FMP VARU FMP XA2 BSR ASPAD < +A2*X*Y, FLD VARU FMP VARU FMP XA1 BSR ASPAD < +A1*X**2, FLD VARU FMP XA0 BSR ASPAD < +A0*X, FDV DENOM < /DENOMINATEUR... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD VARV FMP XA9 FST FWORK < A9*Y, FLD VARV FMP VARV FMP XA8 BSR ASPAD < +A8*Y**2, FLD VARV FMP VARU FMP XA7 BSR ASPAD < +A7*X*Y, FLD VARU FMP VARU FMP XA6 BSR ASPAD < +A6*X**2, FLD VARU FMP XA5 BSR ASPAD < +A5*X, FDV DENOM < /DENOMINATEUR... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT CONFORME 1' DF'SIOT CONFORME 2' ED'SIOT CONFORME 2' IN0 PAGE IDP "SIOT CONFORME 2" < < < T R A N S F O R M A T I O N S C O N F O R M E S 2 : < < < FONCTION : < CE MODULE CALCULE LA TRANS- < FORMATION SUIVANTE (DONT LES < TRANSFORMATIONS Z2 ET 1/Z SONT < DES CAS PARTICULIERS) : < < X=(A16+A0*X+A1*X**2+A2*X*Y+A3*Y**2+A4*Y)/D, < Y=(A17+A5*X+A6*X**2+A7*X*Y+A8*Y**2+A9*Y)/D, < Z=0, < AVEC : < D=A10+A11*X+A12*X**2+A13*X*Y+A14*Y**2+A15*Y. < < ET EN ITERANT 'XA18' FOIS LA TRANSFOR- < MATION, CALCULANT AINSI : < < Z=F(F(...F(Z)...)). < < < TRANSFORMATION CONFORME : Z=Z**2 : < A1=1, < A3=-1, < A7=2, < A10=1. < (TOUS LES AUTRES A(I) ETANT NULS). < < < TRANSFORMATION CONFORME : Z=1/Z : < A0=1, < A9=-1, < A12=1, < A14=1. < (TOUS LES AUTRES A(I) ETANT NULS). < < < PARAMETRES : A0:: VAL 0 < COEFFICIENTS DU NUMERATEUR DE 'X' : A1:: VAL A0+1 A2:: VAL A1+1 A3:: VAL A2+1 A4:: VAL A3+1 A5:: VAL A4+1 < COEFFICIENTS DU NUMERATEUR DE 'Y' : A6:: VAL A5+1 A7:: VAL A6+1 A8:: VAL A7+1 A9:: VAL A8+1 A10:: VAL A9+1 < COEFFICIENTS DU DENOMINATEUR DE X ET Y : A11:: VAL A10+1 A12:: VAL A11+1 A13:: VAL A12+1 A14:: VAL A13+1 A15:: VAL A14+1 A16:: VAL A15+1 A17:: VAL A16+1 A18:: VAL A17+1 < NOMBRE D'ITERATION MAX DE LA FONCTION. A19:: VAL A18+1 < MODULE MAX, AU DELA DUQUEL ON IGNORE < LES POINTS EN RENVOYANT L'INFINI... A20:: VAL A19+1 < QUI DOIT-ON TRACER ??? < =0 : LE COUPLE (X,Y) INITIAL, < #0 : LE COUPLE (X,Y) FINAL. < < < L O C A L : < < LOCAL FLOC: EQU $ PREM: WORD -1 < INDICATEUR DE PREMIER PASSAGE... XA0: FLOAT 0 XA1: FLOAT 0 XA2: FLOAT 0 XA3: FLOAT 0 XA4: FLOAT 0 XA5: FLOAT 0 XA6: FLOAT 0 XA7: FLOAT 0 XA8: FLOAT 0 XA9: FLOAT 0 XA10: FLOAT 0 XA11: FLOAT 0 XA12: FLOAT 0 XA13: FLOAT 0 XA14: FLOAT 0 XA15: FLOAT 0 XA16: FLOAT 0 XA17: FLOAT 0 XA18: WORD 0 < NOMBRE D'ITERATIONS DE LA FONCTION... XA19: FLOAT 0 < MODULE COURANT : RAC(X**2+Y**2). XA20: WORD 0 < QUI DOIT-ON TRACER : < =0 : (VARU,VARV) INITIAL, < #0 : (SVARU,SVARV) FINAL. FINFIN: FLOAT 100000 < INFINI... SVARU: FLOAT 0 < 'U' COURANT, SVARV: FLOAT 0 < 'V' COURANT. DENOM: FLOAT 0 ASPAD: WORD SPAD < S/P DE CUMUL DE 'FWORK'... ASPU2: WORD SPU2 < RELAI... PROG < < < C U M U L : < < SPAD: EQU $ FAD FWORK FST FWORK RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < RECUPERATION DES PARAMETRES : < CPZ PREM < EST-CE LA PREMIERE FOIS... JGE SPU1 < NON... IC PREM < OUI, ENTRONS LES PARAMETRES... LXI A0 BSR ASPCT FST XA0 LXI A1 BSR ASPCT FST XA1 LXI A2 BSR ASPCT FST XA2 LXI A3 BSR ASPCT FST XA3 LXI A4 BSR ASPCT FST XA4 LXI A5 BSR ASPCT FST XA5 LXI A6 BSR ASPCT FST XA6 LXI A7 BSR ASPCT FST XA7 LXI A8 BSR ASPCT FST XA8 LXI A9 BSR ASPCT FST XA9 LXI A10 BSR ASPCT FST XA10 LXI A11 BSR ASPCT FST XA11 LXI A12 BSR ASPCT FST XA12 LXI A13 BSR ASPCT FST XA13 LXI A14 BSR ASPCT FST XA14 LXI A15 BSR ASPCT FST XA15 LXI A16 BSR ASPCT FST XA16 LXI A17 BSR ASPCT FST XA17 LXI A18 BSR ASPCT BSR AROND JALE $ < ?!????!?! STA XA18 < NOMBRE D'ITERATIONS MAX... LXI A19 BSR ASPCT FCAZ JLE $ < ??!?!?! FST XA19 < MODULE MAX... LXI A20 BSR ASPCT BSR AROND STA XA20 < QUI DOIT-ON TRACER ??? SPU1: EQU $ < < INITIALISATION DE L'ITERATION : < PSR X LX XA18 < (X)=NOMBRE D'ITERATIONS... FLD VARU FST SVARU < PARTIE REELLE COURANTE DU 'Z', FLD VARV FST SVARV < PARTIE IMAGINAIRE COURANTE DU 'Z'. < < BOUCLE D'ITERATION DE LA FONCTION : < SPU2: EQU $ < < CALCUL DU DENOMINATEUR : < FLD SVARV FMP XA15 < A15*Y, FST FWORK FLD SVARV FMP SVARV FMP XA14 BSR ASPAD < +A14*Y**2, FLD SVARV FMP SVARU FMP XA13 BSR ASPAD < +A13*X*Y, FLD SVARU FMP SVARU FMP XA12 BSR ASPAD < +A12*X**2, FLD SVARU FMP XA11 BSR ASPAD < +A11*X, FAD XA10 < +A10, FST DENOM < DENOMINATEUR DE 'X' ET 'Y'. < < CALCUL DE 'X' : < FLD SVARV FMP XA4 FST FWORK < A4*Y, FLD SVARV FMP SVARV FMP XA3 BSR ASPAD < +A3*Y**2, FLD SVARV FMP SVARU FMP XA2 BSR ASPAD < +A2*X*Y, FLD SVARU FMP SVARU FMP XA1 BSR ASPAD < +A1*X**2, FLD SVARU FMP XA0 BSR ASPAD < +A0*X, FAD XA16 < +A16, FDV DENOM < /DENOMINATEUR... PSR A,B < SAUVEGARDE DE LA PARTIE REELLE... < < CALCUL DE 'Y' : < FLD SVARV FMP XA9 FST FWORK < A9*Y, FLD SVARV FMP SVARV FMP XA8 BSR ASPAD < +A8*Y**2, FLD SVARV FMP SVARU FMP XA7 BSR ASPAD < +A7*X*Y, FLD SVARU FMP SVARU FMP XA6 BSR ASPAD < +A6*X**2, FLD SVARU FMP XA5 BSR ASPAD < +A5*X, FAD XA17 < +A17, FDV DENOM < /DENOMINATEUR... FST SVARV < NOUVELLE PARTIE IMAGINAIRE, PLR A,B FST SVARU < NOUVELLE PARTIE REELLE... JDX SPU5 < A L'ITERATION SUIVANTE... JMP SPU6 < C'EST FINI... SPU5: EQU $ BR ASPU2 < RELAI VERS LE TOUR SUIVANT... SPU6: EQU $ PLR X < C'EST FINI, < < CALCUL DU MODULE COURANT : < FLD SVARU FMP SVARU FST FWORK < X**2, FLD SVARV FMP SVARV < Y**2, FAD FWORK < X**2+Y**2, BSR ARAC < RAC(X**2+Y**2), FCAM XA19 < TROP GRAND ??? JG SPU7 < OUI, ON IGNORE LE POINT COURANT... CPZ XA20 < NON, OK, MAIS QUI DOIT-ON TRACER ??? JNE SPU3 < (SVARU,SVARV) CALCULES... FLD VARU < NON, (VARU,VARV) INITIAUX... FST SVARU FLD VARV FST SVARV JMP SPU3 < VERS LE RETOUR... SPU7: EQU $ FLD FINFIN < ON IGNORE LE POINT COURANT : FST SVARV < (EN RENVOYANT FST SVARU < L'INFINI...) SPU3: EQU $ FLD SVARU < (A,B)=PARTIE REELLE... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD SVARV < (A,B)=PARTIE IMAGINAIRE... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT CONFORME 2' DF'SIOT COS2X/(X+1)' ED'SIOT COS2X/(X+1)' IN0 PAGE IDP "SIOT COS2X/(X+1)" < < < F O N C T I O N ( ( C O S ( X ) ) * * 2 ) / ( A B S ( X ) + 1 ) : < < < FONCTION : < CE MODULE CALCULE UN CHAMP DE DEPLACE- < MENT TEL QUE : < DELTA(X)=0, < DELTA(Y)=A0*((COS(X))**2)/(A1*ABS(X)+1), < DELTA(Z)=0. < < < ARGUMENT : < A0000=CONSTANTE MULTIPLICATIVE DE DELTA(Y). < A0001=CONSTANTE MULTIPLICATIVE DE ABS(X). A0:: VAL 0 A1:: VAL A0+1 < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ FLD F0 RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI A1 BSR ASPCT FST FWORK < A1. FLD VARU FCAZ JGE SPV1 < X>=0... FNEG < X<0, ON CHANGE SON SIGNE... SPV1: EQU $ FMP FWORK < A1*ABS(X). FAD F1 FST FWORK < A1*ABS(X)+1. LXI A0 BSR ASPCT FST FWORK1 < A0. FLD VARU BSR ACOS FST FWORK2 < COS(X). FMP FWORK2 < (COS(X))**2. FMP FWORK1 < A0*((COS(X))**2). FDV FWORK < A0*((COS(X))**2)/(A1*ABS(X)+1). RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT COS2X/(X+1)' DF'SIOT COS2X/(X2+1)' ED'SIOT COS2X/(X2+1)' IN0 PAGE IDP "SIOT COS2X/(X2+1)" < < < F O N C T I O N ( ( C O S ( X ) ) * * 2 ) / ( X * * 2 + 1 ) : < < < FONCTION : < CE MODULE CALCULE UN CHAMP DE DEPLACE- < MENT TEL QUE : < DELTA(X)=0, < DELTA(Y)=A0*((COS(X))**2)/(X**2+1), < DELTA(Z)=0. < < < ARGUMENT : < A0000=CONSTANTE MULTIPLICATIVE DE DELTA(Y). A0:: VAL 0 < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ FLD F0 RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD VARU FMP VARU FAD F1 FST FWORK < X**2+1. LXI A0 BSR ASPCT FST FWORK1 < A0. FLD VARU BSR ACOS FST FWORK2 < COS(X). FMP FWORK2 < (COS(X))**2. FMP FWORK1 < A0*((COS(X))**2). FDV FWORK < A0*((COS(X))**2)/(X**2+1). RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT COS2X/(X2+1)' DF'SIOT FUITE' ED'SIOT FUITE' IN0 PAGE IDP "SIOT FUITE" < < < C O N S T R U C T I O N D ' U N E F U I T E : < < < FONCTION : < JOINT TOUS LES POINTS DE L'IMAGE A UN POINT < FIXE EN ARRIERE DE L'ECRAN... < < < NOTA : < S'UTILISE AVEC TOUS LES COEFFICIENTS < MULTIPLICATEURS 'K...' EGAUX A 1... < < < ARGUMENTS : A0000:: VAL 0 < X(POINT DE FUITE), A0001:: VAL A0000+1 < Y(POINT DE FUITE), A0002:: VAL A0001+1 < Z(POINT DE FUITE). < < LOCAL FLOC: EQU $ PROG < < < D E P L A C E M E N T ' U ' : < < SPU: EQU $ LXI A0000 BSR ASPCT FSB VARU RSR < < < D E P L A C E M E N T ' V ' : < < SPV: EQU $ LXI A0001 BSR ASPCT FSB VARV RSR < < < D E P L A C E M E N T ' W ' : < < SPW: EQU $ LXI A0002 BSR ASPCT FSB VARW RSR :F :F < <<'SIOT FUITE' DF'SIOT MAGRITTE 1' ED'SIOT MAGRITTE 1' IN0 PAGE IDP "SIOT MAGRITTE 1" < < < M A G R I T T E 1 : < < < FONCTION : < CE MODULE INSERE L'IMAGE < FIGURANT EN 'MEMTV2' DANS LES < CONTOURS DE L'IMAGE RESIDENTE < ET L'AFFICHE DANS L'IMAGE < SCRATCH 'MEMTV'... < < < ATTENTION : < LE POINT (0,0) EST MARQUE < IL FAUT DONC ENSUITE L'ELIMINER < SI NECESSAIRE... < < LOCAL FLOC: EQU $ SX1: WORD 0 < PREMIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). SXN: WORD 0 < DERNIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). SY1: WORD 0 < PREMIER POINT NON NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). SYN: WORD 0 < DERNIER POINT NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < DEFINITION DE LA VERTICALE EN 'XR' : < LA YR PSR A < SAVE 'YR', STZ YR < ET ON COMMENCE EN HAUT : SPU1: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU2 < ON S'ARRETE AU PREMIER NON NOIR... IC YR < SINON, JMP SPU1 < AU SUIVANT... SPU2: EQU $ LAI NLIGM1 < ET ON REPART EN BAS, XM YR STA SY1 < EN SAUVANT LE PREMIER... SPU3: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU4 < ON S'ARRETE AU DERNIER NON NOIR... DC YR < SINON, JMP SPU3 < AU PRECEDENT... SPU4: EQU $ IC YR < POUR EVITER LES DENOMINATEURS NULS. PLR A XM YR < ON RESTAURE 'YR', STA SYN < EN SAUVANT LE DERNIER... < < RECHERCHE DE L'HORIZONTALE : < LA XR PSR A STZ XR < ON COMMENCE A GAUCHE : SPU5: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU6 < ON S'ARRETE AU PREMIER NON NOIR... IC XR < SINON, JMP SPU5 < AU SUIVANT... SPU6: EQU $ LAI NPOLM1 XM XR < ET ON REPART A DROITE... STA SX1 < EN SAUVANT LE PREMIER... SPU7: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU8 < ON S'ARRETE AU DERNIER NON NOIR... DC XR < SINON, JMP SPU7 < AU SUIVANT... SPU8: EQU $ IC XR < POUR EVITER LES DENOMINATEURS NULS. PLR A XM XR < RESTAURATION DE 'XR', STA SXN < ET ON SAUVE LE DERNIER... < < GENERATION DE 'XS' : < LA SXN SB SX1 FLT FST FWORK LA XR SB SX1 FLT FDV FWORK FST FWORK LAI NPOLM1 FLT FMP FWORK BSR AROND STA XS < XS=NPOLM1*(XR-SX1)/(SXN-SX1). < < GENERATION DE 'YS' : < LA SYN SB SY1 FLT FST FWORK LA YR SB SY1 FLT FDV FWORK FST FWORK LAI NLIGM1 FLT FMP FWORK BSR AROND STA YS < YS=NLIGM1*(YR-SY1)/(SYN-SY1). < < ACCES AU POINT (XS,YS) DE 'MEMTV2' : < LA CTCDA STA XCTCDA BSR ASPGPS < A=NIVEAU(XS,YS) DE 'MEMTV2' : STZ XCTCDA LB XR STB XS LB YR STB YS BSR ASPRPS < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'... FLD F0 < ET ON SE PLACE A L'ORIGINE... < ON MARQUE DONC TOUJOURS LE MEME < POINT (0,0) !!! RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD F0 < ET ON SE PLACE A L'ORIGINE... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT MAGRITTE 1' DF'SIOT MAGRITTE 2' ED'SIOT MAGRITTE 2' IN0 PAGE IDP "SIOT MAGRITTE 2" < < < M A G R I T T E 2 : < < < FONCTION : < CE MODULE INSERE L'IMAGE < FIGURANT EN 'MEMTV2' DANS LES < CONTOURS DE L'IMAGE RESIDENTE < ET L'AFFICHE DANS L'IMAGE < SCRATCH 'MEMTV'... < POUR CELA, EN CHAQUE POINT (XR,YR), < ELLE DETERMINE LA VERTICALE (SY1,SYN) < DEFINIE PAR LES BARYCENTRES DE < SES POINTS EXTREMES NON NOIRS, ET < L'HORIZONTALE (SX1,SXN) DEFINIE DE < MEME... LES POINTS SONT PONDERES PAR < LEUR NIVEAU DE GRIS. < < < PARAMETRES : A0:: VAL 0 < A0='NPM'=NOMBRE DE POINTS D'UNE SPIRALE, A1:: VAL A0+1 < A1='PASQ'=PAS DE PARCOURS. < < < ATTENTION : < LE POINT (0,0) EST MARQUE < IL FAUT DONC ENSUITE L'ELIMINER < SI NECESSAIRE... < < LOCAL FLOC: EQU $ < < PARAMETRES DE LA SPIRALE : < NPM: WORD 0 < A0=NOMBRE DE POINTS DE LA SPIRALE. PASQ: WORD 0 < A1=PAS DE PARCOURS DE LA SPIRALE. < < VARIABLES DE CONSTRUCTION DE LA SPIRALE : < DELTAX: WORD 0 < PAS DE PARCOURS SUR 'X', DELTAY: WORD 0 < PAS DE PARCOURS SUR 'Y'. NP: WORD 0 < NOMBRE COURANT DE POINTS TRAITES. LB0: WORD 0 < LONGUEUR PREVUE DU BRAS COURANT, LB: WORD 0 < LONGUEUR COURANTE DU BRAS COURANT. CUMUL: WORD 0 < CUMUL=SIGMA(N(I)) I=1...NPM, CUMULX: WORD 0 < CUMULX=SIGMA(N(I)*X(I)) I=1...NPM, CUMULY: WORD 0 < CUMULY=SIGMA(N(I)*Y(I)) I=1...NPM. ABARYC: WORD BARYC < CALCUL BARYCENTRE AUTOUR DE (XR,YR). < < DEFINITION HORIZONTALE ET VERTICALE : < SX1: WORD 0 < PREMIER POINT NON NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). SXN: WORD 0 < DERNIER POINT NON NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). SY1: WORD 0 < PREMIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). SYN: WORD 0 < DERNIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT BSR AROND STA NPM LXI A1 BSR ASPCT BSR AROND STA PASQ < < DEFINITION DE LA VERTICALE EN 'XR' : < LA YR PSR A < SAVE 'YR', STZ YR < ET ON COMMENCE EN HAUT : SPU1: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU2 < ON S'ARRETE AU PREMIER NON NOIR... IC YR < SINON, JMP SPU1 < AU SUIVANT... SPU2: EQU $ BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), LAI NLIGM1 < ET ON REPART EN BAS, XM YR STY SY1 < EN SAUVANT LE BARYCENTRE... SPU3: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU4 < ON S'ARRETE AU DERNIER NON NOIR... DC YR < SINON, JMP SPU3 < AU PRECEDENT... SPU4: EQU $ IC YR < POUR EVITER LES DENOMINATEURS NULS... BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), PLR A XM YR < ON RESTAURE 'YR', STY SYN < EN SAUVANT LE BARYCENTRE... < < RECHERCHE DE L'HORIZONTALE EN 'YR' : < LA XR PSR A STZ XR < ON COMMENCE A GAUCHE : SPU5: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU6 < ON S'ARRETE AU PREMIER NON NOIR... IC XR < SINON, JMP SPU5 < AU SUIVANT... SPU6: EQU $ BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), LAI NPOLM1 XM XR < ET ON REPART A DROITE... STX SX1 < EN SAUVANT LE BARYCENTRE... SPU7: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU8 < ON S'ARRETE AU DERNIER NON NOIR... DC XR < SINON, JMP SPU7 < AU SUIVANT... SPU8: EQU $ IC XR < POUR EVITER LES DENOMINATEURS NULS... BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), PLR A XM XR < RESTAURATION DE 'XR', STX SXN < EN SAUVANT LE BARYCENTRE... < < GENERATION DE 'XS' : < LA SXN SB SX1 STA WORK1 LA XR SB SX1 STA WORK2 LAI NPOLM1 MP WORK2 DV WORK1 STA XS < XS=NPOLM1*(XR-SX1)/(SXN-SX1). < < GENERATION DE 'YS' : < LA SYN SB SY1 STA WORK1 LA YR SB SY1 STA WORK2 LAI NLIGM1 MP WORK2 DV WORK1 STA YS < YS=NLIGM1*(YR-SY1)/(SYN-SY1). < < ACCES AU POINT (XS,YS) DE 'MEMTV2' : < LA CTCDA STA XCTCDA BSR ASPGPS < A=NIVEAU(XS,YS) DE 'MEMTV2' : STZ XCTCDA LB XR STB XS LB YR STB YS BSR ASPRPS < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'... FLD F0 < ET ON SE PLACE A L'ORIGINE... < ON MARQUE DONC TOUJOURS LE MEME < POINT (0,0) !!! RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD F0 < ET ON SE PLACE A L'ORIGINE... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < B A R Y C E N T R E A U T O U R D ' U N P O I N T : < < BARYC: EQU $ LA XR LB YR PSR A,B < SAUVEGARDE DU POINT (XR,YR). STZ CUMUL < CUMUL <-- 0, STZ CUMULX < CUMULX <-- 0, STZ CUMULY < CUMULY <-- 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... BSR ASPGPR < A=NIVEAU(XR,YR), PSR A < SAUVEGARDE DU NIVEAU N(XR,YR), PSR A < IDEM... AD CUMUL STA CUMUL < CUMUL=SIGMA(NIVEAU(XR,YR)), PLR A MP XR LR B,A AD CUMULX STA CUMULX < CUMULX=SIGMA(N(XR,YR)*XR), PLR A MP YR LR B,A AD CUMULY STA CUMULY < CUMULY=SIGMA(N(XR,YR)*YR). SPMOY4: EQU $ LA XR AD DELTAX < CHANGEMENT DE STA XR LA YR AD DELTAY < POINT COURANT (XR,YR). 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 POINT (XS,YS) : < SPMOY3: EQU $ PLR A,B STA XR < RESTAURATION STB YR < DE (XR,YR), LA CUMULX SARD NBITMO DV CUMUL LR A,X < X=COORDONNEE DU BARYCENTRE, LA CUMULY SARD NBITMO DV CUMUL LR A,Y < Y=COORDONNEE DU BARYCENTRE... RSR :F :F < <<'SIOT MAGRITTE 2' DF'SIOT MAGRITTE 3' ED'SIOT MAGRITTE 3' IN0 PAGE IDP "SIOT MAGRITTE 3" < < < M A G R I T T E 3 : < < < FONCTION : < CE MODULE INSERE L'IMAGE < FIGURANT EN 'MEMTV2' DANS LES < CONTOURS DE L'IMAGE RESIDENTE < ET L'AFFICHE DANS L'IMAGE < SCRATCH 'MEMTV'... < POUR CELA, EN CHAQUE POINT (XR,YR), < ELLE DETERMINE LA VERTICALE (SY1,SYN) < DEFINIE PAR LES BARYCENTRES DE < SES POINTS EXTREMES NON NOIRS, ET < L'HORIZONTALE (SX1,SXN) DEFINIE DE < MEME... ON ELIMINE AINSI LES POINTS < NOIRS QUI COMPTE POUR 0, ALORS QUE < LES AUTRES COMPTENT POUR 1. < < < PARAMETRES : A0:: VAL 0 < A0='NPM'=NOMBRE DE POINTS D'UNE SPIRALE, A1:: VAL A0+1 < A1='PASQ'=PAS DE PARCOURS. < < < ATTENTION : < LE POINT (0,0) EST MARQUE < IL FAUT DONC ENSUITE L'ELIMINER < SI NECESSAIRE... < < LOCAL FLOC: EQU $ < < PARAMETRES DE LA SPIRALE : < NPM: WORD 0 < A0=NOMBRE DE POINTS DE LA SPIRALE. PASQ: WORD 0 < A1=PAS DE PARCOURS DE LA SPIRALE. < < VARIABLES DE CONSTRUCTION DE LA SPIRALE : < DELTAX: WORD 0 < PAS DE PARCOURS SUR 'X', DELTAY: WORD 0 < PAS DE PARCOURS SUR 'Y'. NP: WORD 0 < NOMBRE COURANT DE POINTS TRAITES. LB0: WORD 0 < LONGUEUR PREVUE DU BRAS COURANT, LB: WORD 0 < LONGUEUR COURANTE DU BRAS COURANT. CUMUL: WORD 0 < CUMUL=SIGMA(N(I)) I=1...NPM, CUMULX: WORD 0 < CUMULX=SIGMA(X(I)) I=1...NPM, CUMULY: WORD 0 < CUMULY=SIGMA(Y(I)) I=1...NPM. ABARYC: WORD BARYC < CALCUL BARYCENTRE AUTOUR DE (XR,YR). < < DEFINITION HORIZONTALE ET VERTICALE : < SX1: WORD 0 < PREMIER POINT NON NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). SXN: WORD 0 < DERNIER POINT NON NOIR A L'HORIZONTALE < DU POINT ARGUMENT (XR,YR). SY1: WORD 0 < PREMIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). SYN: WORD 0 < DERNIER POINT NON NOIR A LA VERTICALE < DU POINT ARGUMENT (XR,YR). PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT BSR AROND STA NPM LXI A1 BSR ASPCT BSR AROND STA PASQ < < DEFINITION DE LA VERTICALE EN 'XR' : < LA YR PSR A < SAVE 'YR', STZ YR < ET ON COMMENCE EN HAUT : SPU1: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU2 < ON S'ARRETE AU PREMIER NON NOIR... IC YR < SINON, JMP SPU1 < AU SUIVANT... SPU2: EQU $ BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), LAI NLIGM1 < ET ON REPART EN BAS, XM YR STY SY1 < EN SAUVANT LE BARYCENTRE... SPU3: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU4 < ON S'ARRETE AU DERNIER NON NOIR... DC YR < SINON, JMP SPU3 < AU PRECEDENT... SPU4: EQU $ IC YR < POUR EVITER LES DENOMINATEURS NULS... BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), PLR A XM YR < ON RESTAURE 'YR', STY SYN < EN SAUVANT LE BARYCENTRE... < < RECHERCHE DE L'HORIZONTALE EN 'YR' : < LA XR PSR A STZ XR < ON COMMENCE A GAUCHE : SPU5: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU6 < ON S'ARRETE AU PREMIER NON NOIR... IC XR < SINON, JMP SPU5 < AU SUIVANT... SPU6: EQU $ BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), LAI NPOLM1 XM XR < ET ON REPART A DROITE... STX SX1 < EN SAUVANT LE BARYCENTRE... SPU7: EQU $ BSR ASPGPR < A=NIVEAU DU POINT (XR,YR) COURANT : JANE SPU8 < ON S'ARRETE AU DERNIER NON NOIR... DC XR < SINON, JMP SPU7 < AU SUIVANT... SPU8: EQU $ IC XR < POUR EVITER LES DENOMINATEURS NULS... BSR ABARYC < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR), PLR A XM XR < RESTAURATION DE 'XR', STX SXN < EN SAUVANT LE BARYCENTRE... < < GENERATION DE 'XS' : < LA SXN SB SX1 STA WORK1 LA XR SB SX1 STA WORK2 LAI NPOLM1 MP WORK2 DV WORK1 STA XS < XS=NPOLM1*(XR-SX1)/(SXN-SX1). < < GENERATION DE 'YS' : < LA SYN SB SY1 STA WORK1 LA YR SB SY1 STA WORK2 LAI NLIGM1 MP WORK2 DV WORK1 STA YS < YS=NLIGM1*(YR-SY1)/(SYN-SY1). < < ACCES AU POINT (XS,YS) DE 'MEMTV2' : < LA CTCDA STA XCTCDA BSR ASPGPS < A=NIVEAU(XS,YS) DE 'MEMTV2' : STZ XCTCDA LB XR STB XS LB YR STB YS BSR ASPRPS < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'... FLD F0 < ET ON SE PLACE A L'ORIGINE... < ON MARQUE DONC TOUJOURS LE MEME < POINT (0,0) !!! RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD F0 < ET ON SE PLACE A L'ORIGINE... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < B A R Y C E N T R E A U T O U R D ' U N P O I N T : < < BARYC: EQU $ LA XR LB YR PSR A,B < SAUVEGARDE DU POINT (XR,YR). STZ CUMUL < CUMUL <-- 0, STZ CUMULX < CUMULX <-- 0, STZ CUMULY < CUMULY <-- 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... BSR ASPGPR < A=NIVEAU(XR,YR), JAE SPMOY4 < POINT NOIR, ON L'IGNORE... IC CUMUL < COMPTAGE DES POINTS NON NOIRS. LA CUMULX AD XR STA CUMULX < CUMULX=SIGMA(XR), LA CUMULY AD YR STA CUMULY < CUMULY=SIGMA(YR). SPMOY4: EQU $ LA XR AD DELTAX < CHANGEMENT DE STA XR LA YR AD DELTAY < POINT COURANT (XR,YR). 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 POINT (XS,YS) : < SPMOY3: EQU $ PLR A,B STA XR < RESTAURATION STB YR < DE (XR,YR), LA CUMULX SARD NBITMO DV CUMUL LR A,X < X=COORDONNEE DU BARYCENTRE, LA CUMULY SARD NBITMO DV CUMUL LR A,Y < Y=COORDONNEE DU BARYCENTRE... RSR :F :F < <<'SIOT MAGRITTE 3' DF'SIOT MAGRITTE 4' ED'SIOT MAGRITTE 4' IN0 PAGE IDP "SIOT MAGRITTE 4" < < < T R A N S F O R M A T I O N M A G R I T T E 4 : < < < FONCTION : < CE MODULE, EN CHAQUE POINT < (XR,YR) EXAMINE LA REPARTITION < DES MASSES (C'EST-A-DIRE DES < POINTS NON NOIRS) A GAUCHE, EN < BAS, A DROITE ET EN HAUT. A PARTIR < DES 4 CENTRES DE GRAVITE AINSI < DETERMINES, IL CALCULE LES CORDONNEES < TRANSFORMEES (XS,YS), CE QUI PER- < MET D'ACCEDER AU NIVEAU DE CE POINT < (XS,YS) DANS 'TV2' QUE L'ON ATTRIBUE < AU POINT (XS,YS)=(XR,YR) DE 'TV1'... < UNE DEUXIEME METHODE EST IMPLEMENTEE, < ELLE COMPTE LES POINTS NOIRS A DROITE ET < A GAUCHE (RESPECTIVEMENT EN HAUT ET < EN BAS) DU POINT COURANT (XR,YR), ET < EN DEDUIT LES POSITIONS RELATIVES DES < TROUS, ET DONC LA TORSION DE L'IMAGE < 'TV2'. < C'EST CETTE DEUXIEME METHODE QUI < DONNE LE MEILLEUR RESULTAT !!! < < < ARGUMENTS : A0:: VAL 0 < INCREMENT SUR OX DE PASSAGE D'UN POINT < A UN AUTRE POUR LE CALCUL DES 'G' ; A1:: VAL A0+1 < DE MEME SUR OY... A2:: VAL A1+1 < MODE DE CALCUL : < =0 : CENTRES DE GRAVITES, < #0 : COMPTAGE DES POINTS NOIRS. < < LOCAL FLOC: EQU $ PREM: WORD 0 < INDICATEUR DE PREMIER PASSAGE... XRP: WORD NPOLM1 < POINT YRP: WORD NLIGM1 < PRECEDENT. SXC: WORD 0 < SAUVEGARDE DU SYC: WORD 0 < POINT COURANT (XR,YR). XG: WORD 0 < CENTRE DE GRAVITE GAUCHE, XD: WORD 0 < CENTRE DE GRAVITE DROITE, YG: WORD 0 < CENTRE DE GRAVITE HAUT, YD: WORD 0 < CENTRE DE GRAVITE BAS. ASPU12: WORD SPU12 < SORTIE SUR POINT (XR,YR) NON NOIR... XA0: WORD 0 < INCREMENT SUR OX, XA1: WORD 0 < INCREMENT SUR OY. XA2: WORD 0 < MODE DE CALCUL : < =0 : CENTRES DE GRAVITES DES POINTS < NON NOIRS, < #0 : COMPTAGE DES POINTS NOIRS. FINFIN: FLOAT 1000 PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < AU PREMIER PASSAGE, ENTREE DES < INCREMENTS SUR OX ET OY : < CPZ PREM < PREMIER PASSAGE ??? JG SPU50 < NON... IC PREM < OUI : LXI A2 BSR ASPCT BSR AROND STA XA2 < MODE DE CALCUL... LXI A0 BSR ASPCT BSR AROND JALE $ STA XA0 < INCREMENT SUR OX, LXI A1 BSR ASPCT BSR AROND JALE $ STA XA1 < INCREMENT SUR OY. SPU50: EQU $ < < ON NE FAIT CALCULER LES CENTRES < DE GRAVITE SUR LES POINTS NOIRS < DE L'IMAGE RESIDENTE : < BSR ASPGPR < (A)=NIVEAU(XR,YR) : JAE SPU13 < OK, LE POINT EST NOIR... BR ASPU12 < IL N'EST PAS NOIR, ON L'IGNORE... SPU13: EQU $ < < SAUVEGARDE DU POINT COURANT : < LA XR LB YR STB SYC STA SXC < < TEST DE LA NECESSITE DU < CALCUL DES CENTRES DE GRAVITE : < CPZ XA2 < MODE ??? JNE SPU10 < PAR COMPTAGE DES POINTS NOIRS... LA YR < PAR 'G' : CP YRP < EST-ON SUR LA MEME HORIZONTALE ??? JNE SPU10 < NON, CALCUL NECESSAIRE... LA XR SB XRP CPI 1 < OUI, EST-ON VOISIN DU POINT PRECEDENT ??? JE SPU20 < OUI, LA REPARTITION HORIZONTALE DES < MASSES N'A PAS CHANGEE, ON VA CALCULER < UNIQUEMENT SUR LA VERTICALE... SPU10: EQU $ < < RECHERCHE DE 'G' HORIZONTAL GAUCHE : < LAI -1 STA XR < INITIALISATION POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RECONTRES JUSQU'A 'SXC'. LYI 0 < COMPTAGE DES NOIRS... SPU1: EQU $ LA XR < AU POINT SUIVANT : AD XA0 STA XR CP SXC < EST-CE LE POINT COURANT ??? JGE SPU2 < OUI, FIN DE LA RECHERCHE A GAUCHE... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU1 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA XR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU1 < VERS LE POINT SUIVANT... SPU2: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA0 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU31 < COMPTAGE POINTS NOIRS... LAI 0 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU31 < NON, ON PREND 'SXC'... LR X,A < OUI : FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ABSCISSES, FDV FWORK2 BSR AROND SPU31: EQU $ STA XG < CE QUI DONNE LE 'G' HORIZONTAL GAUCHE... < < RECHERCHE DU 'G' HORIZONTAL DROITE : < LAI NPOLM1 ADRI 1,A STA XR < INITIALISATION DU POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RENCONTRES JUSQU'A 'SXC'. LYI 0 < COMPTAGE DES NOIRS... SPU3: EQU $ LA XR < AU POINT PRECEDENT : SB XA0 STA XR CP SXC < EST-CE LE POINT COURANT ??? JLE SPU4 < OUI, FIN DE LA RECHERCHE A DROITE... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU3 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA XR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU3 < VERS LE POINT PRECEDENT... SPU4: EQU $ LR Y,A < (A)=COMPTE DES NOIRS... MP XA0 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU32 < COMPTAGE DES POINTS NOIRS... LAI NPOLM1 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU32 < NON, ON PREND 'SXC'... LR X,A < OUI... FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ABSCISSES, FDV FWORK2 BSR AROND SPU32: EQU $ STA XD < CE QUI DONNE LE 'G' HORIZONTAL DROITE... < < RECHERCHE DE 'G' VERTICAL HAUT : < LA SXC STA XR < RESTAURE 'XR'... SPU20: EQU $ < CAS OU LES 'G' HORIZONTAUX NE SONT PAS < A CALCULER... LAI -1 STA YR < INITIALISATION POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RECONTRES JUSQU'A 'SYC'. LYI 0 < COMPTAGE DES POINTS NOIRS... SPU5: EQU $ LA YR < AU POINT SUIVANT : AD XA1 STA YR CP SYC < EST-CE LE POINT COURANT ??? JGE SPU6 < OUI, FIN DE LA RECHERCHE EN HAUT... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU5 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA YR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU5 < VERS LE POINT SUIVANT... SPU6: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA1 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU33 < COMPTAGE DES POINT NOIRS... LAI 0 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU33 < NON, ON PREND 'SYC'... LR X,A FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ORDONNEES, FDV FWORK2 BSR AROND SPU33: EQU $ STA YG < CE QUI DONNE LE 'G' VERTICAL HAUT... < < RECHERCHE DU 'G' VERTICAL BAS : < LAI NLIGM1 ADRI 1,A STA YR < INITIALISATION DU POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RENCONTRES JUSQU'A 'SYC'. LYI 0 < COMPTAGE DES POINTS NOIRS... SPU7: EQU $ LA YR < AU POINT PRECEDENT : SB XA1 STA YR CP SYC < EST-CE LE POINT COURANT ??? JLE SPU8 < OUI, FIN DE LA RECHERCHE EN BAS... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU7 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA YR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU7 < VERS LE POINT PRECEDENT... SPU8: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA1 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU34 < COMPTAGE DES POINTS NOIRS... LAI NLIGM1 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU34 < NON, ON PREND 'SYC'... LR X,A FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ORDONNEES, FDV FWORK2 BSR AROND SPU34: EQU $ STA YD < CE QUI DONNE LE 'G' VERTICAL BAS... < < RESTAURATION DU POINT COURANT : < LA SYC STA YR < < MEMORISATION DU POINT COURANT : < SPU11: EQU $ LA XR LB YR STB YRP STA XRP < < CALCUL DU POINT (XS,YS) : < CPZ XA2 < MODE ??? JE SPU60 < CENTRES DE GRAVITE... LA XG < COMPTAGE DES POINTS NOIRS : FLT FST FWORK1 < FWORK1=XG, LA XG AD XD FLT FST FWORK2 < FWORK2=XG+XD, JMP SPU61 SPU60: EQU $ < CENTRES DE GRAVITE : LA XR SB XG FLT FST FWORK1 < FWORK1=XR-XG, LA XD SB XR FLT < XD-XR, FAD FWORK1 < (XD-XR)+(XR-XG), FST FWORK2 < FWORK2=XD-XG, SPU61: EQU $ LAI NPOLM1 FLT FMP FWORK1 FDV FWORK2 BSR AROND STA XS < XS=255*(XR-XG)/(XD-XG) SI 'G', < =255*XG/(XG+XD) SI COMPTAGE NOIRS. CPZ XA2 < MODE ??? JE SPU62 < CENTRES DE GRAVITE... LA YG < COMPTAGE DES POINTS NOIRS : FLT FST FWORK1 < FWORK1=YG, LA YG AD YD FLT FST FWORK2 < FWORK2=YG+YD, JMP SPU63 SPU62: EQU $ < CENTRES DE GRAVITE : LA YR SB YG FLT FST FWORK1 < FWORK1=YR-YG, LA YD SB YR FLT < YD-YR, FAD FWORK1 < (YD-YR)+(YR-YG), FST FWORK2 < FWORK2=YD-YG, SPU63: EQU $ LAI NLIGM1 FLT FMP FWORK1 FDV FWORK2 BSR AROND STA YS < YS=255*(YR-YG)/(YD-YG) SI 'G', < =255*YG/(YG+YD) SI COMPTAGE NOIRS. < < ACCES AU POINT (XS,YS) DE 'MEMTV2' : < LA CTCDA STA XCTCDA BSR ASPGPS < A=NIVEAU(XS,YS) DE 'MEMTV2' : STZ XCTCDA LB XR STB XS LB YR STB YS BSR ASPRPS < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'... SPU12: EQU $ FLD FINFIN < ON NE BOUGE PAS... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD FINFIN < ON NE BOUGE PAS... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT MAGRITTE 4' DF'SIOT MAGRITTE 5' ED'SIOT MAGRITTE 5' IN0 PAGE IDP "SIOT MAGRITTE 5" < < < T R A N S F O R M A T I O N M A G R I T T E 5 : < < < FONCTION : < CE MODULE, EN CHAQUE POINT < (XR,YR) EXAMINE LA REPARTITION < DES MASSES (C'EST-A-DIRE DES < POINTS NON NOIRS) A GAUCHE, EN < BAS, A DROITE ET EN HAUT. A PARTIR < DES 4 CENTRES DE GRAVITE AINSI < DETERMINES, IL CALCULE LES CORDONNEES < TRANSFORMEES (XS,YS), CE QUI PER- < MET D'ACCEDER A UN NIVEAU MOYEN AUTOUR DE < CE POINT (XS,YS) DANS 'TV2' QUE L'ON ATTRIBUE < AU POINT (XS,YS)=(XR,YR) DE 'TV1'... < UNE DEUXIEME METHODE EST IMPLEMENTEE, < ELLE COMPTE LES POINTS NOIRS A DROITE ET < A GAUCHE (RESPECTIVEMENT EN HAUT ET < EN BAS) DU POINT COURANT (XR,YR), ET < EN DEDUIT LES POSITIONS RELATIVES DES < TROUS, ET DONC LA TORSION DE L'IMAGE < 'TV2'. < C'EST CETTE DEUXIEME METHODE QUI < DONNE LE MEILLEUR RESULTAT !!! < < < ARGUMENTS : A0:: VAL 0 < INCREMENT SUR OX DE PASSAGE D'UN POINT < A UN AUTRE POUR LE CALCUL DES 'G' ; A1:: VAL A0+1 < DE MEME SUR OY... A2:: VAL A1+1 < MODE DE CALCUL : < =0 : CENTRES DE GRAVITES, < #0 : COMPTAGE DES POINTS NOIRS. A3:: VAL A2+1 < NOMBRE DE POINTS DE LA SPIRALE ; SI < CELUI-CI EST NUL, IL N'Y A PAS DE CALCUL < DE FONCTION MONTAGNEUSE... A4:: VAL A3+1 < PAS DE PARCOURS DE LA SPIRALE (+1 EN < GENERAL...). A5:: VAL A4+1 < MODE DE PARCOURS DE LA SPIRALE : < -1 : RECHERCHE DU NIVEAU MIN, < 0 : RECHERCHE DU NIVEAU MOYEN, < +1 : RECHERCHE DU NIVEAU MAX. < < LOCAL FLOC: EQU $ PREM: WORD 0 < INDICATEUR DE PREMIER PASSAGE... XRP: WORD NPOLM1 < POINT YRP: WORD NLIGM1 < PRECEDENT. SXC: WORD 0 < SAUVEGARDE DU SYC: WORD 0 < POINT COURANT (XR,YR). XG: WORD 0 < CENTRE DE GRAVITE GAUCHE, XD: WORD 0 < CENTRE DE GRAVITE DROITE, YG: WORD 0 < CENTRE DE GRAVITE HAUT, YD: WORD 0 < CENTRE DE GRAVITE BAS. ASPU12: WORD SPU12 < SORTIE SUR POINT (XR,YR) NON NOIR... XA0: WORD 0 < INCREMENT SUR OX, XA1: WORD 0 < INCREMENT SUR OY. XA2: WORD 0 < MODE DE CALCUL : < =0 : CENTRES DE GRAVITES DES POINTS < NON NOIRS, < #0 : COMPTAGE DES POINTS NOIRS. FINFIN: FLOAT 1000 < < DEFINITION DE LA SPIRALE : < SPIMOD: WORD 0 < MODE DE PARCOURS (CF. 'A5'). SPIMIN: WORD 0 < MIN COURANT SUR UNE SPIRALE, CUMUL: WORD 0 < SIGMA(NIVEAU(XS,YS)) SUR UNE SPIRALE, SPIMAX: WORD 0 < MAX COURANT SUR UNE SPIRALE. PASQ: WORD 0 < ARGUMENT 'A4'. DELTAX: WORD 0 DELTAY: WORD 0 LB: WORD 0 < LONGUEUR DES LB0: WORD 0 < BRANCHES DE LA SPIRALE. NP: WORD 0 < NOMBRE DE POINT COURANT, NPM: WORD 0 < NOMBRE DE POINTS ENTIER DE LA SPIRALE. FNP: FLOAT 0 < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE. PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < TEST DU PREMIER PASSAGE : < CPZ PREM < PREMIER PASSAGE ??? JG SPU50 < NON... IC PREM < OUI : < < ENTREE DES INCTREMENTS SUR OX ET OY : < LXI A2 BSR ASPCT BSR AROND STA XA2 < MODE DE CALCUL... LXI A0 BSR ASPCT BSR AROND JALE $ STA XA0 < INCREMENT SUR OX, LXI A1 BSR ASPCT BSR AROND JALE $ STA XA1 < INCREMENT SUR OY. < < DEFINITION DE LA SPIRALE : < LXI A3 BSR ASPCT FST FNP FIX STA NPM < NOMBRE DE POINTS MAX... JALE $ < ??!??!?! LXI A4 BSR ASPCT BSR AROND STA PASQ < PAS DE PARCOURS... LXI A5 BSR ASPCT BSR AROND STA SPIMOD < MODE DE PARCOURS DE LA SPIRALE... SPU50: EQU $ < < ON NE FAIT CALCULER LES CENTRES < DE GRAVITE SUR LES POINTS NOIRS < DE L'IMAGE RESIDENTE : < BSR ASPGPR < (A)=NIVEAU(XR,YR) : JAE SPU13 < OK, LE POINT EST NOIR... BR ASPU12 < IL N'EST PAS NOIR, ON L'IGNORE... SPU13: EQU $ < < SAUVEGARDE DU POINT COURANT : < LA XR LB YR STB SYC STA SXC < < TEST DE LA NECESSITE DU < CALCUL DES CENTRES DE GRAVITE : < CPZ XA2 < MODE ??? JNE SPU10 < PAR COMPTAGE DES POINTS NOIRS... LA YR < PAR 'G' : CP YRP < EST-ON SUR LA MEME HORIZONTALE ??? JNE SPU10 < NON, CALCUL NECESSAIRE... LA XR SB XRP CPI 1 < OUI, EST-ON VOISIN DU POINT PRECEDENT ??? JE SPU20 < OUI, LA REPARTITION HORIZONTALE DES < MASSES N'A PAS CHANGEE, ON VA CALCULER < UNIQUEMENT SUR LA VERTICALE... SPU10: EQU $ < < RECHERCHE DE 'G' HORIZONTAL GAUCHE : < LAI -1 STA XR < INITIALISATION POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RECONTRES JUSQU'A 'SXC'. LYI 0 < COMPTAGE DES NOIRS... SPU1: EQU $ LA XR < AU POINT SUIVANT : AD XA0 STA XR CP SXC < EST-CE LE POINT COURANT ??? JGE SPU2 < OUI, FIN DE LA RECHERCHE A GAUCHE... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU1 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA XR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU1 < VERS LE POINT SUIVANT... SPU2: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA0 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU31 < COMPTAGE POINTS NOIRS... LAI 0 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU31 < NON, ON PREND 'SXC'... LR X,A < OUI : FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ABSCISSES, FDV FWORK2 BSR AROND SPU31: EQU $ STA XG < CE QUI DONNE LE 'G' HORIZONTAL GAUCHE... < < RECHERCHE DU 'G' HORIZONTAL DROITE : < LAI NPOLM1 ADRI 1,A STA XR < INITIALISATION DU POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RENCONTRES JUSQU'A 'SXC'. LYI 0 < COMPTAGE DES NOIRS... SPU3: EQU $ LA XR < AU POINT PRECEDENT : SB XA0 STA XR CP SXC < EST-CE LE POINT COURANT ??? JLE SPU4 < OUI, FIN DE LA RECHERCHE A DROITE... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU3 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA XR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU3 < VERS LE POINT PRECEDENT... SPU4: EQU $ LR Y,A < (A)=COMPTE DES NOIRS... MP XA0 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU32 < COMPTAGE DES POINTS NOIRS... LAI NPOLM1 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU32 < NON, ON PREND 'SXC'... LR X,A < OUI... FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ABSCISSES, FDV FWORK2 BSR AROND SPU32: EQU $ STA XD < CE QUI DONNE LE 'G' HORIZONTAL DROITE... < < RECHERCHE DE 'G' VERTICAL HAUT : < LA SXC STA XR < RESTAURE 'XR'... SPU20: EQU $ < CAS OU LES 'G' HORIZONTAUX NE SONT PAS < A CALCULER... LAI -1 STA YR < INITIALISATION POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RECONTRES JUSQU'A 'SYC'. LYI 0 < COMPTAGE DES POINTS NOIRS... SPU5: EQU $ LA YR < AU POINT SUIVANT : AD XA1 STA YR CP SYC < EST-CE LE POINT COURANT ??? JGE SPU6 < OUI, FIN DE LA RECHERCHE EN HAUT... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU5 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA YR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU5 < VERS LE POINT SUIVANT... SPU6: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA1 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU33 < COMPTAGE DES POINT NOIRS... LAI 0 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU33 < NON, ON PREND 'SYC'... LR X,A FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ORDONNEES, FDV FWORK2 BSR AROND SPU33: EQU $ STA YG < CE QUI DONNE LE 'G' VERTICAL HAUT... < < RECHERCHE DU 'G' VERTICAL BAS : < LAI NLIGM1 ADRI 1,A STA YR < INITIALISATION DU POINT DE DEPART. FLD F0 FST FWORK1 < INITIALISATION DU CUMUL, LXI 0 < INITIALISATION DU COMPTAGE DE POINTS < NON NOIRS RENCONTRES JUSQU'A 'SYC'. LYI 0 < COMPTAGE DES POINTS NOIRS... SPU7: EQU $ LA YR < AU POINT PRECEDENT : SB XA1 STA YR CP SYC < EST-CE LE POINT COURANT ??? JLE SPU8 < OUI, FIN DE LA RECHERCHE EN BAS... BSR ASPGPR < NON, TEST DU POINT (XR,YR) : ADRI 1,Y < A PRIORI... JAE SPU7 < IL EST NOIR, ON L'IGNORE... ADRI -1,Y < CORRECTION... LA YR < IL N'EST PAS NOIR, FLT FAD FWORK1 FST FWORK1 < ON LE CUMULE, ADRI 1,X < ET ON LE COMPTE... JMP SPU7 < VERS LE POINT PRECEDENT... SPU8: EQU $ LR Y,A < (A)=NOMBRE DE POINTS NOIRS... MP XA1 LR B,A < SCALING... CPZ XA2 < MODE ??? JNE SPU34 < COMPTAGE DES POINTS NOIRS... LAI NLIGM1 < A PRIORI... (CENTRES DE GRAVITE) CPZR X < A-T'ON RENCONTRE DES POINTS ??? JE SPU34 < NON, ON PREND 'SYC'... LR X,A FLT FST FWORK2 < NOMBRE DE POINTS NON NOIRS, FLD FWORK1 < SIGMA DE LEURS ORDONNEES, FDV FWORK2 BSR AROND SPU34: EQU $ STA YD < CE QUI DONNE LE 'G' VERTICAL BAS... < < RESTAURATION DU POINT COURANT : < LA SYC STA YR < < MEMORISATION DU POINT COURANT : < SPU11: EQU $ LA XR LB YR STB YRP STA XRP < < CALCUL DU POINT (XS,YS) : < CPZ XA2 < MODE ??? JE SPU60 < CENTRES DE GRAVITE... LA XG < COMPTAGE DES POINTS NOIRS : FLT FST FWORK1 < FWORK1=XG, LA XG AD XD FLT FST FWORK2 < FWORK2=XG+XD, JMP SPU61 SPU60: EQU $ < CENTRES DE GRAVITE : LA XR SB XG FLT FST FWORK1 < FWORK1=XR-XG, LA XD SB XR FLT < XD-XR, FAD FWORK1 < (XD-XR)+(XR-XG), FST FWORK2 < FWORK2=XD-XG, SPU61: EQU $ LAI NPOLM1 FLT FMP FWORK1 FDV FWORK2 BSR AROND STA XS < XS=255*(XR-XG)/(XD-XG) SI 'G', < =255*XG/(XG+XD) SI COMPTAGE NOIRS. CPZ XA2 < MODE ??? JE SPU62 < CENTRES DE GRAVITE... LA YG < COMPTAGE DES POINTS NOIRS : FLT FST FWORK1 < FWORK1=YG, LA YG AD YD FLT FST FWORK2 < FWORK2=YG+YD, JMP SPU63 SPU62: EQU $ < CENTRES DE GRAVITE : LA YR SB YG FLT FST FWORK1 < FWORK1=YR-YG, LA YD SB YR FLT < YD-YR, FAD FWORK1 < (YD-YR)+(YR-YG), FST FWORK2 < FWORK2=YD-YG, SPU63: EQU $ LAI NLIGM1 FLT FMP FWORK1 FDV FWORK2 BSR AROND STA YS < YS=255*(YR-YG)/(YD-YG) SI 'G', < =255*YG/(YG+YD) SI COMPTAGE NOIRS. < < < G E N E R A T I O N D ' U N E S P I R A L E < A U T O U R D E ( X S , Y S ) D E ' T V 2 ' : < < LA CTCDA STA XCTCDA < PASSAGE SUR 'TV2'... < < INITIALISATION DE LA SPIRALE : < LA XS LB YS PSR A,B < SAUVEGARDE DU POINT (XS,YS). LAI NIVMAX+1 STA SPIMIN < MIN(NIVEAUX)... STZ CUMUL < CUMUL <-- 0. LAI -NIVMAX-1 STA SPIMAX < MAX(NIVEAUX)... 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 XS < NON : LB YS PSR A,B < SAVE (XS,YS) AVANT LE TORE EVENTUEL... CPZ MODX < Y-A-T'IL X-TORE ??? JE SPMOY6 < OUI... JAL SPMOY4 < NON, LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPMOY4 < HORS-ECRAN... SPMOY6: EQU $ ANDI NPOLM1 < CALCUL MODULO... STA XS < MISE A JOUR DE XS. LR B,A < (A)=YS, CPZ MODY < EST-ON SUR UN Y-TORE ??? JE SPMOY7 < OUI... JAL SPMOY4 < NON, LE POINT EST HORS-ECRAN... CPI NLIGM1 JG SPMOY4 < HORS-ECRAN... SPMOY7: EQU $ ANDI NLIGM1 < CALCUL MODULO... STA YS < MISE A JOUR DE YS. BSR ASPGPS < A=NIVEAU(XS,YS), CP SPIMIN JGE SPMOY9 STA SPIMIN < MEMORISATION DU NIVEAU MIN... SPMOY9: EQU $ CP SPIMAX JLE SPMOYA STA SPIMAX < MEMORISATION DE NIVEAU MAX... SPMOYA: EQU $ AD CUMUL < ET STA CUMUL < CUMULE... SPMOY4: EQU $ PLR A,B < (A)=XS, < (B)=YS. AD DELTAX < CHANGEMENT DE STA XS LR B,A < (A)=YS. AD DELTAY < POINT COURANT (XS,YS). STA YS 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 POINT (XS,YS) : < SPMOY3: EQU $ PLR A,B STA XS < RESTAURATION STB YS < DE (XS,YS), < < GENERATION D'UN NIVEAU : < CPZ SPIMOD < QUEL EST LE MODE DE GENERATION ??? LA SPIMIN JL SPU70 < PAR LE MIN(NIVEAUX)... LA SPIMAX JG SPU70 < PAR LE MAX(NIVEAUX)... LA CUMUL < PAR LA MOYENNE : FLT FDV FNP BSR AROND SPU70: EQU $ < (A)=NIVEAU... STZ XCTCDA < RETOUR A 'TV1'... < < GENERATION DE L'IMAGE DISTORDUE : < LB XR STB XS LB YR STB YS BSR ASPRPS < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'... SPU12: EQU $ FLD FINFIN < ON NE BOUGE PAS... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD FINFIN < ON NE BOUGE PAS... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT MAGRITTE 5' DF'SIOT NEUTRE' ED'SIOT NEUTRE' IN0 < IDP "SIOT NEUTRE" < < N E U T R E : < < < FONCTION : < CE MODULE NE FAIT RIEN, CE < QUI PERMET PAR EXEMPLE DE METTRE < EN PERSPECTIVE UNE IMAGE PLATTE < PAR CHANGEMENT DE LA MATRICE < DE TRANSFORMATION... < < < ARGUMENTS : A0:: VAL 0 < TRANSLATION EN 'X', A1:: VAL A0+1 < TRANSLATION EN 'Y', A2:: VAL A1+1 < TRANSLATION EN 'Z'. < < LOCAL FLOC: EQU $ PREM: WORD 0 < INDICATEUR DE PREMIER PASSAGE... XFA0: FLOAT 0 XFA1: FLOAT 0 XFA2: FLOAT 0 PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < ENTREE DES PARAMETRES : < CPZ PREM < PREMIER PASSAGE ??? JG SPU1 < NON... IC PREM < OUI, ON LE MEMORISE... LXI A0 BSR ASPCT FST XFA0 LXI A1 BSR ASPCT FST XFA1 LXI A2 BSR ASPCT FST XFA2 < < CALCUL DE LA COORDONNEE : < SPU1: EQU $ FLD VARU FAD XFA0 < ET TRANSLATION... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD VARV FAD XFA1 < ET TRANSLATION... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD XFA2 RSR :F :F < <<'SIOT NEUTRE' DF'SIOT ONDES P C' ED'SIOT ONDES P C' IN0 PAGE IDP "SIOT ONDES P C" < < < C A L C U L D ' U N E O N D E P : < < < FONCTION : < CALCULER UNE ONDE P D'EQUATION : < U=COS(-X+2*PI*T), < V=0, < W=0. < DE PLUS ON FAIT LES CONVENTIONS DE < COULEUR SUIVANTES : < U>0 : XXB, < U=0 : XXV, < U<0 : XXR. < < LOCAL XXB:: VAL 4 < BLEU, XXV:: VAL 4 < BLEU, XXR:: VAL 2 < VERT. FLOC: EQU $ P2PI: FLOAT 6.283 PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VART FMP P2PI FSB VARU FST FWORK BSR ASIN < CALCUL DE LA DERIVEE SIN(-X+2*PI*T), FCAZ < ??? LAI XXB < BLEU A PRIORI... JG SPU1 < OUI... LAI XXV < VERT A PRIORI... JE SPU1 < OUI... LAI XXR < IL NE RESTE QUE LE ROUGE... SPU1: EQU $ STA KCOUL < MAJ MODE DE TRACE DES VECTEURS... BSR ASPRPR < ON MODIFIE L'IMAGE RESIDENTE... FLD FWORK BSR ACOS < CALCUL DU DEPLACEMENT COS(-X+2*PI*T). RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD F0 RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT ONDES P C' DF'SIOT ONDES PS2' ED'SIOT ONDES PS2' IN0 PAGE IDP "SIOT ONDES PS2" < < < O N D E S P S 2 : < < < FONCTION : < ON CALCULE LE VECTEUR DEPLACEMENT DE < COORDONNEES : < U=A0000*COS(A0001*X+A0002*T), < V=A0003*SIN(A0004*X+A0005*T). < < < NOTA : < CE PROGRAMME S'APPELLE 'PS2', < ET NON PAS 'PS1', CAR IL EXISTE < DEJA UN ITEM 'ONDES PS1'... < < LOCAL FLOC: EQU $ A0:: VAL 0 A1:: VAL 1 A2:: VAL 2 A3:: VAL 3 A4:: VAL 4 A5:: VAL 5 PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A1 BSR ASPCT FMP VARU FST FWORK LXI A2 BSR ASPCT FMP VART FAD FWORK BSR ACOS FST FWORK LXI A0 BSR ASPCT FMP FWORK < A0*COS(A1*X+A2*T). RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ LXI A4 BSR ASPCT FMP VARU FST FWORK LXI A5 BSR ASPCT FMP VART FAD FWORK BSR ASIN FST FWORK LXI A3 BSR ASPCT FMP FWORK < A3*SIN(A4*X+A5*T). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT ONDES PS2' DF'SIOT ONDES S C' ED'SIOT ONDES S C' IN0 PAGE IDP "SIOT ONDES S C" < < < C A L C U L D ' U N E O N D E S : < < < FONCTION : < CALCULER UNE ONDE P D'EQUATION : < U=0, < V=COS(-X+2*PI*T), < W=0. < DE PLUS ON FAIT LES CONVENTIONS DE < COULEUR SUIVANTES : < V>0 : XXB, < V=0 : XXV, < V<0 : XXR. < < LOCAL XXB:: VAL 4 < BLEU, XXV:: VAL 4 < BLEU, XXR:: VAL 2 < VERT. FLOC: EQU $ P2PI: FLOAT 6.283 PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD F0 RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VART FMP P2PI FSB VARU FST FWORK BSR ASIN < CALCUL DE LA DERIVEE SIN(-X+2*PI*T), FCAZ < ??? LAI XXB < BLEU A PRIORI... JG SPV1 < OUI... LAI XXV < VERT A PRIORI... JE SPV1 < OUI... LAI XXR < IL NE RESTE QUE LE ROUGE... SPV1: EQU $ STA KCOUL < MAJ MODE DE TRACE DES VECTEURS... BSR ASPRPR < ON MODIFIE L'IMAGE RESIDENTE... FLD FWORK BSR ACOS < CALCUL DU DEPLACEMENT COS(-X+2*PI*T). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT ONDES S C' DF'SIOT POISSON' ED'SIOT POISSON' IN0 PAGE IDP "SIOT POISSON" < < < F O N C T I O N " P O I S S O N " : < < < FONCTION : < ON CALCULE LA TRANSFORMATION SUIVANTE : < U=X, < V=Y+(A0*Y/(A1*(X**2)+1)), < W=0. < CELA DONNE UNE TRANSFORMATION EXAGERANT < LE CENTRE DE L'IMAGE SUIVANT UNE DIRECTION < VERTICALE (CF. LE 'Y' MULTIPLICATEUR DE < DE 1/(X**2+1) ). CELA DONNE UNE SORTE < DE BOURSOUFLURE... < < < NOTA : < ON L'APPELLE AINSI, CAR ELLE SERT < A FAIRE UN IMAGE DE MC. ESCHER EN < FORME D'ARETES DE POISSON... < < < PARAMETRES : A0000:: VAL 0 < COEFFICIENT DE Y, A0001:: VAL A0000+1 < COEFFICIENT DE X**2. < < LOCAL FLOC: EQU $ XA0: FLOAT 0 XA1: FLOAT 0 PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ FLD VARU FDV FK RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < ENTREE DES PARAMETRES : < LXI A0000 BSR ASPCT FST XA0 LXI A0001 BSR ASPCT FST XA1 < < CALCUL DU POINT : < FLD VARU FMP VARU FDV FK FDV FK FMP XA1 FAD F1 FST FWORK FLD VARV FDV FK FMP XA0 FDV FWORK FMP FK FST FWORK FLD VARV FDV FK FAD FWORK RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT POISSON' DF'SIOT POLAIRE' ED'SIOT POLAIRE' IN0 PAGE IDP "SIOT POLAIRE" < < < T R A N S F O R M A T I O N P O L A I R E : < < < FONCTION : < CE PROGRAMME CALCULE : < U=X*COS(Y), < V=X*SIN(Y), < W=0, < U, V ET W ETANT DES DEPLACEMENTS ABSOLUS... < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VARV BSR ACOS FMP VARU < VARU*COS(VARV). RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VARV BSR ASIN FMP VARU < VARU*SIN(VARV). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT POLAIRE' DF'SIOT POLAIRE 1' ED'SIOT POLAIRE 1' IN0 PAGE IDP "SIOT POLAIRE 1" < < < T R A N S F O R M A T I O N P O L A I R E 1 : < < < FONCTION : < CE PROGRAMME CALCULE : < U=X*COS(Y/X), < V=X*SIN(Y/X), < W=0, < U, V ET W ETANT DES DEPLACEMENTS ABSOLUS... < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VARV FDV VARU BSR ACOS FMP VARU < VARU*COS(VARV/VARU). RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VARV FDV VARU BSR ASIN FMP VARU < VARU*SIN(VARV/VARU). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT POLAIRE 1' DF'SIOT POLAIRE 2' ED'SIOT POLAIRE 2' IN0 PAGE IDP "SIOT POLAIRE 2" < < < T R A N S F O R M A T I O N P O L A I R E 2 : < < < FONCTION : < CE PROGRAMME CALCULE : < U=X/RAC(1+TG(Y)**2), < V=X*TG(Y)/RAC(1+TG(Y)**2), < W=0, < U, V ET W ETANT DES DEPLACEMENTS ABSOLUS... < < < ARGUMENT : A0:: VAL 0 < VALEUR DE EPSILON... < < LOCAL FLOC: EQU $ XF1: FLOAT 1 XFWORK: FLOAT 0 FEPS: FLOAT 0 < EPSILON D'EVALUATION DE LA POSITION DE < 'VARV' PAR RAPPORT A PI/2. ASP1: WORD SP1 < TEST PAR RAPPORT A PI/2 ET 3*PI/2. ATG: WORD TG < S/P DE CALCUL DE LA TANGENTE... ZZZ116: DZS 2 ZZZ117: WORD '7F7D;'FFFF < +INFINI ZZZ118: WORD '807D;'0001 < -INFINI ZZZ106: EQU PISUR2 PROG < < < C A L C U L D E T G : < < < ARGUMENT : < (A,B)=ARGUMENT EN RADIAN. < < < RESULTAT : < (A,B)=TG(ARGUMENT). < < TG: EQU $ FST FWORK FSB ZZZ106 FNEG BSR ASIN FST ZZZ116 FLD FWORK BSR ASIN FCMZ ZZZ116 JE ZZZ121 FDV ZZZ116 ZZZ123: EQU $ < < RETOUR : < PSR A,B < SAVE LA TANGENTE, FLD FWORK FABS FCAM PISUR2 < COMMENT EST L'ARGUMENT ??? PLR A,B < RESTAURE LA TANGENTE, JL TG2 < L'ARGUMENT EST ENTRE -PI/2 ET +PI/2... FNEG < DANS LES AUTRE CAS ON INVERSE POUR RENDRE < LA TANGENTE "CONTINUE"... TG2: EQU $ RSR ZZZ121: EQU $ FCAZ JL ZZZ122 FLD ZZZ117 JMP ZZZ123 ZZZ122: EQU $ FLD ZZZ118 JMP ZZZ123 < < < T E S T P A R R A P P O R T A P I / 2 E T 3 * P I / 2 : < < SP1: EQU $ FLD VARV < ARGUMENT, FSB PISUR2 FABS FCAM FEPS < TEST PAR RAPPORT A PI/2... JLE SP11 < PRES... FLD VARV DO 3 FSB PISUR2 FABS FCAM FEPS < TEST PAR RAPPORT A 3*PI/2... SP11: EQU $ RSR < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT FST FEPS < RECUPERATION DE EPSILON... BSR ASP1 < POSITION DE 'VARV' PAR RAPPORT A PI/2 : JG SPU1 < LOIN... FLD F0 < PRES : X=0... JMP SPU2 SPU1: EQU $ FLD VARV BSR ATG FST FWORK FMP FWORK FAD XF1 BSR ARAC FST FWORK FLD VARU FDV FWORK < X/RAC(1+TG(Y)**2). SPU2: EQU $ RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ BSR ASP1 < POSITION DE 'VARV' PAR RAPPORT A PI/2 : JG SPV1 < LOIN... FLD VARU < PRES : Y=X... JMP SPV2 SPV1: EQU $ FLD VARV BSR ATG FST XFWORK FMP XFWORK FAD XF1 BSR ARAC FST FWORK FLD VARU FMP XFWORK FDV FWORK < X*TG(Y)/RAC(1+TG(Y)**2). SPV2: EQU $ RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT POLAIRE 2' DF'SIOT POLAIRE 3' ED'SIOT POLAIRE 3' IN0 PAGE IDP "SIOT POLAIRE 3" < < < T R A N S F O R M A T I O N P O L A I R E 3 : < < < FONCTION : < CE PROGRAMME CALCULE : < U=X/RAC(1+Y**2), < V=X*Y/RAC(1+Y**2), < W=0, < U, V ET W ETANT DES DEPLACEMENTS ABSOLUS... < < LOCAL FLOC: EQU $ XF1: FLOAT 1 PROG < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VARV FMP VARV FAD XF1 BSR ARAC FST FWORK FLD VARU FDV FWORK < X/RAC(1+Y**2). RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VARV FMP VARV FAD XF1 BSR ARAC FST FWORK FLD VARU FMP VARV FDV FWORK < X*Y/RAC(1+Y**2). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT POLAIRE 3' DF'SIOT RDN' ED'SIOT RDN' IN0 PAGE IDP "SIOT RDN" < < < R D N < P O I N T S A L E A T O I R E S : < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES : < < < ARGUMENT : < A0000=BORNE SUPERIEURE DES NOMBRES ALEATOIRES, < A0001=BORNE INFERIEURE. A0000:: VAL 0 A0001:: VAL 1 < < LOCAL FLOC: EQU $ 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 ARDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. XA0000: WORD 0 < BORNE SUPERIEURE, XA0001: WORD 0 < BORNE INFERIEURE... PROG < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ LXI A0000 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0001 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... SPRDN1: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN CP XA0000 < ??? JG SPRDN1 < TROP GRAND... CP XA0001 < ??? JL SPRDN1 < TROP PETIT... FLT RSR < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ BSR ARDN RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ BSR ARDN RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ BSR ARDN RSR :F :F < <<'SIOT RDN' DF'SIOT RDN 1' ED'SIOT RDN 1' IN0 PAGE IDP "SIOT RDN 1" < < < R D N 1 < ( R H O , T E T A ) A L E A T O I R E S : < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES, < EN CALCULANT UN MODULE ET UN ANGLE < ALEATOIRES, QUI CHACUN SONT COMPARES < A DES BORNES (INF,SUP)... < < < ARGUMENTS : < A0=BORNE INFERIEURE DE TETA (EN DEG90*DEGRES), < A1=BORNE SUPERIEURE DE TETA (EN DEG90*DEGRES), < A2=BORNE INFERIEURE DE RHO, < A3=BORNE SUPERIEURE DE RHO. < < A0:: VAL 0 A1:: VAL A0+1 A2:: VAL A1+1 A3:: VAL A2+1 < < LOCAL FLOC: EQU $ 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 RDN7:: VAL 3 POINTS: WORD 16807 ARDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. RDNT: FLOAT 0 < ANGLE TETA ALEATOIRE, INFT: FLOAT 0 < BORNE INFERIEURE DE TETA, SUPT: FLOAT 0 < BORNE SUPERIEURE DE TETA. RDNM: FLOAT 0 < MODULE RHO ALEATOIRE, INFM: FLOAT 0 < BORNE INFERIEURE DE RHO, SUPM: FLOAT 0 < BORNE SUPERIEURE DE RHO. DEG90:: VAL 90 < FACTEUR D'ECHELLE DES BORNES... F180: FLOAT <180*DEG90<0<0 < 180 DEGRES=PI RADIANS... PROG < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN FLT RSR < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT FST INFT LXI A1 BSR ASPCT FST SUPT LXI A2 BSR ASPCT FST INFM LXI A3 BSR ASPCT FST SUPM < < MODULE ALEATOIRE : < SPU1: EQU $ BSR ARDN < GENERATION D'UN NOMBRE ALEATOIRE : FCAM INFM JL SPU11 < IL NE SATISFAIT PAS AUX CONTRAINTES... FCAM SUPM JG SPU11 < IDEM... FST RDNM < OK, VOICI LE RHO ALEATOIRE... < < ANGLE ALEATOIRE : < SPU2: EQU $ BSR ARDN < GENERATION D'UN NOMBRE ALEATOIRE : FCAM INFT JL SPU21 < IL NE SATISFAIT PAS AUX CONTRAINTES... FCAM SUPT JG SPU21 < IDEM... FMP PI3141 FDV F180 < CONVERSION EN RADIANS, FST RDNT < OK, VOICI LE TETA ALEATOIRE... < < CALCUL DU VECTEUR ALEATOIRE : < BSR ACOS FMP RDNM < U=RHO*COS(TETA). RSR < < NON SATISFACTION AUX CONTRAINTES : < ON MODIFIE LE GENERATEUR, AFIN < D'EVITER DES BOUCLAGES... < SPU11: EQU $ LA RDN LB RDN4 SCRD RDN7 STB RDN4 STA RDN JMP SPU1 SPU21: EQU $ LA RDN LB RDN4 SCLD RDN7 STB RDN4 STA RDN JMP SPU2 < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD RDNT BSR ASIN FMP RDNM < V=RHO*SIN(TETA). RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT RDN 1' DF'SIOT RDN 2' ED'SIOT RDN 2' IN0 PAGE IDP "SIOT RDN 2" < < < R D N 2 < ( R H O , T E T A ) A L E A T O I R E S : < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES, < EN CALCULANT UN MODULE ET UN ANGLE < ALEATOIRES, QUI CHACUN SONT COMPARES < A DES BORNES (INF,SUP)... < LORSQU'ON A OBTENU UN DEPLACEMENT 'D', < ON L'APPLIQUE AU POINT (XR,YR) INDEPENDAM- < MENT DE LA MATRICE DE TRANSFORMATION (???!), < ET ON REGARDE OU EST LE POINT : < (XS,XS) <-- (XR,YR)+FK*'D', < S'IL SORT DE L'ECRAN, ON LE RAMENE AU BORD < DE CELUI-CI, ET S'IL TOMBE SUR UN POINT < DEJA OCCUPE, ON REFAIT UN TIRAGE ALEATOIRE... < < < ARGUMENTS : < A0=BORNE INFERIEURE DE TETA (EN DEG90*DEGRES), < A1=BORNE SUPERIEURE DE TETA (EN DEG90*DEGRES), < A2=BORNE INFERIEURE DE RHO, < A3=BORNE SUPERIEURE DE RHO. < < A0:: VAL 0 A1:: VAL A0+1 A2:: VAL A1+1 A3:: VAL A2+1 < < LOCAL FLOC: EQU $ 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 RDN7:: VAL 3 POINTS: WORD 16807 ARDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. RDNT: FLOAT 0 < ANGLE TETA ALEATOIRE, INFT: FLOAT 0 < BORNE INFERIEURE DE TETA, SUPT: FLOAT 0 < BORNE SUPERIEURE DE TETA. RDNM: FLOAT 0 < MODULE RHO ALEATOIRE, INFM: FLOAT 0 < BORNE INFERIEURE DE RHO, SUPM: FLOAT 0 < BORNE SUPERIEURE DE RHO. DEG90:: VAL 90 < FACTEUR D'ECHELLE DES BORNES... F180: FLOAT <180*DEG90<0<0 < 180 DEGRES=PI RADIANS... PROG < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN FLT RSR < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT FST INFT LXI A1 BSR ASPCT FST SUPT LXI A2 BSR ASPCT FST INFM LXI A3 BSR ASPCT FST SUPM < < MODULE ALEATOIRE : < SPU1: EQU $ BSR ARDN < GENERATION D'UN NOMBRE ALEATOIRE : FCAM INFM JL SPU11 < IL NE SATISFAIT PAS AUX CONTRAINTES... FCAM SUPM JG SPU11 < IDEM... FST RDNM < OK, VOICI LE RHO ALEATOIRE... < < ANGLE ALEATOIRE : < SPU2: EQU $ BSR ARDN < GENERATION D'UN NOMBRE ALEATOIRE : FCAM INFT JL SPU21 < IL NE SATISFAIT PAS AUX CONTRAINTES... FCAM SUPT JG SPU21 < IDEM... FMP PI3141 FDV F180 < CONVERSION EN RADIANS, FST RDNT < OK, VOICI LE TETA ALEATOIRE... < < CALCUL DU VECTEUR ALEATOIRE : < BSR ACOS FMP RDNM < U=RHO*COS(TETA). FMP FK FAD FXR BSR AROND AD TRX JAGE SPU3 < OK... LAI 0 < HORS-ECRAN... SPU3: EQU $ CPI NPOLM1 JLE SPU31 < OK... LAI NPOLM1 < HORS-ECRAN... SPU31: EQU $ STA XS < XS=XR+FK*VECU. FLD RDNT < ACCES AU TETA ALEATOIRE : BSR ASIN FMP RDNM < V=RHO*SIN(TETA) (PROVISOIRE...). FMP FK FAD FYR BSR AROND AD TRY JAGE SPU32 < OK... LAI 0 < HORS-ECRAN... SPU32: EQU $ CPI NLIGM1 JLE SPU33 < OK... LAI NLIGM1 < HORS-ECRAN... SPU33: EQU $ STA YS < YS=YR+FK*VECV. BSR ASPGPS < A=NIVEAU(XS,YS) : JAE SPU5 < OK, LE POINT (XS,YS) EST LIBRE... FLD F0 < ET BIEN NON, IL EST OCCUPE, FST VECV < ON NE DEPLACE PAS LE POINT (XR,YR). JMP SPU51 SPU5: EQU $ LA YS SB TRY FLT FSB FYR FDV FK FST VECV < COMPOSANTE 'V' ALEATOIRE FINALE... LA XS SB TRX FLT FSB FYR FDV FK < COMPOSANTE 'U' ALEATOIRE FINALE... SPU51: EQU $ RSR < < NON SATISFACTION AUX CONTRAINTES : < ON MODIFIE LE GENERATEUR, AFIN < D'EVITER DES BOUCLAGES... < SPU11: EQU $ LA RDN LB RDN4 SCRD RDN7 STB RDN4 STA RDN JMP SPU1 SPU21: EQU $ LA RDN LB RDN4 SCLD RDN7 STB RDN4 STA RDN JMP SPU2 < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VECV RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT RDN 2' DF'SIOT RDN 3' ED'SIOT RDN 3' IN0 PAGE IDP "SIOT RDN 3" < < < R D N 3 : < P O I N T S A L E A T O I R E S : < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES ; < IL RENORMALISE A PRIORI LES COMPO- < SANTES ALEATOIRES DANS LE SEGMENT < (INF,SUP). < < < ARGUMENT : < A0000=BORNE SUPERIEURE DE RDN(U), < A0001=BORNE INFERIEURE DE RDN(U), < A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U', < A0003=SUP(RDN(V)), < A0004=INF(RDN(V)), < A0005=MUL(RDN(V)), < A0006=SUP(RDN(W)), < A0007=INF(RDN(W)), < A0008=MUL(RDN(W)). A0000:: VAL 0 A0001:: VAL A0000+1 A0002:: VAL A0001+1 A0003:: VAL A0002+1 A0004:: VAL A0003+1 A0005:: VAL A0004+1 A0006:: VAL A0005+1 A0007:: VAL A0006+1 A0008:: VAL A0007+1 < < LOCAL FLOC: EQU $ 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 ARDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. XA0000: WORD 0 < BORNE SUPERIEURE, XA0001: WORD 0 < BORNE INFERIEURE... FMUL: FLOAT 0 < MULTIPLICATEUR... INFINI: FLOAT 32768 INFIN2: FLOAT 16384 < INFINI/2... FWORK4: FLOAT 0 FWORK5: FLOAT 0 PROG < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ SPRDN1: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN SPRDN2: EQU $ FLT FMP F05 < RDN/2, PSR A,B < SAVE RDN/2... FAD INFIN2 < (RDN+INFINI)/2, FST FWORK4 LA XA0000 < BORNE SUPERIEURE, FLT FMP FWORK4 FST FWORK4 PLR A,B < RDN/2, FSB INFIN2 < (RDN-INFINI)/2, FST FWORK5 LA XA0001 < BORNE INFERIEURE, FLT FMP FWORK5 FST FWORK5 FLD FWORK4 FSB FWORK5 FDV INFINI < MISE A L'ECHELLE... FIX CP XA0000 < ??? JG SPRDN3 < ERREUR... CP XA0001 < ??? JL SPRDN3 < ERREUR... FLT FMP FMUL RSR SPRDN3: EQU $ QUIT 1 JMP SPRDN2 < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A0000 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0001 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0002 BSR ASPCT FST FMUL BSR ARDN RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ LXI A0003 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0004 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0005 BSR ASPCT FST FMUL BSR ARDN RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ LXI A0006 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0007 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0008 BSR ASPCT FST FMUL BSR ARDN RSR :F :F < <<'SIOT RDN 3' DF'SIOT RDN 4' ED'SIOT RDN 4' IN0 PAGE IDP "SIOT RDN 4" < < < R D N 4 : < P O I N T S A L E A T O I R E S : < ( T 4 ) < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES ; < IL RENORMALISE A PRIORI LES COMPO- < SANTES ALEATOIRES DANS LE SEGMENT < (INF,SUP) QUI EST EN FAIT RECALCULER < POUR CHAQUE POINT : < INF=KI-ABS(COORDONNEE), < SUP=KS-ABS(COORDONNEE), < AVEC : KS>KU... < < < ARGUMENT : < A0000=KS(RDN(U)), < A0001=KI(RDN(U)), < A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U', < A0003=KS(RDN(V)), < A0004=KI(RDN(V)), < A0005=MUL(RDN(V)), < A0006=KS(RDN(W)), < A0007=KI(RDN(W)), < A0008=MUL(RDN(W)). A0000:: VAL 0 A0001:: VAL A0000+1 A0002:: VAL A0001+1 A0003:: VAL A0002+1 A0004:: VAL A0003+1 A0005:: VAL A0004+1 A0006:: VAL A0005+1 A0007:: VAL A0006+1 A0008:: VAL A0007+1 < < LOCAL FLOC: EQU $ ASP1: WORD SP1 ASP2: WORD SP2 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 ARDN: WORD SQRDN < GENERATEUR DE NOMBRES ALEATOIRES. XA0000: WORD 0 < BORNE SUPERIEURE, XA0001: WORD 0 < BORNE INFERIEURE... FMUL: FLOAT 0 < MULTIPLICATEUR... INFINI: FLOAT 32768 INFIN2: FLOAT 16384 < INFINI/2... FWORK4: FLOAT 0 FWORK5: FLOAT 0 PROG < < < S / P D E C A L C U L D E S S E U I L S : < < < ARGUMENT : < X=NUMERO DE LA CONSTANTE A RECUPERER, < < < RESULTAT : < A=SEUIL. < < SP1: EQU $ BSR ASPCT < RECUPERATION DE LA CONSTANTE (X), FAD FWORK < +(-ABS(COORDONNEE)), FIX JAGE SP11 LAI 0 < NEGATIF, ON TRONQUE... SP11: EQU $ RSR < < < A C C E S C O O R D O N N E E : < < SP2: EQU $ FABS FNEG FST FWORK RSR < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ SPRDN1: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN SPRDN2: EQU $ FLT FMP F05 < RDN/2, PSR A,B < SAVE RDN/2... FAD INFIN2 < (RDN+INFINI)/2, FST FWORK4 LA XA0000 < BORNE SUPERIEURE, FLT FMP FWORK4 FST FWORK4 PLR A,B < RDN/2, FSB INFIN2 < (RDN-INFINI)/2, FST FWORK5 LA XA0001 < BORNE INFERIEURE, FLT FMP FWORK5 FST FWORK5 FLD FWORK4 FSB FWORK5 FDV INFINI < MISE A L'ECHELLE... FIX CP XA0000 < ??? JG SPRDN3 < ERREUR... CP XA0001 < ??? JL SPRDN3 < ERREUR... FLT FMP FMUL RSR SPRDN3: EQU $ QUIT 1 JMP SPRDN2 < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < SQRDN: EQU $ FLT < FLOTTAISON DU DISCRIMINATEUR DE VARU, < VARV ET VARW... FAD VARU FAD VARV FAD VARW < DISCRIMINATEUR+VARU+VARV+VARW, FST FWORK4 FLD VARU FMP VARV FAD FWORK4 BSR ASIN < DONT ON PREND LE SINUS... EORR B,A < ON CUMULE LES 2 MOTS, JMP SPRDN2 < QUE L'ON CONSIDERE ENTIER... < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VARV BSR ASP2 < -ABS(VARV). LXI A0000 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0001 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0002 BSR ASPCT FST FMUL LA RDN1 < (A)=DISCRIMINATEUR DE 'VARU'... BSR ARDN RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VARU BSR ASP2 < -ABS(VARU). LXI A0003 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0004 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0005 BSR ASPCT FST FMUL LA RDN2 < (A)=DISCRIMINATEUR DE 'VARV'... BSR ARDN RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD VARW BSR ASP2 < -ABS(VARW). LXI A0006 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0007 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0008 BSR ASPCT FST FMUL LA RDN4 < (A)=DISCRIMINATEUR DE 'VARW'... BSR ARDN RSR :F :F < <<'SIOT RDN 4' DF'SIOT RDN 5' ED'SIOT RDN 5' IN0 PAGE IDP "SIOT RDN 5" < < < R D N 5 : < P O I N T S A L E A T O I R E S : < ( T 6 ) < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES ; < IL RENORMALISE A PRIORI LES COMPO- < SANTES ALEATOIRES DANS LE SEGMENT < (INF,SUP) QUI EST EN FAIT RECALCULER < POUR CHAQUE POINT : < INF=KI-ABS(COORDONNEE), < SUP=KS-ABS(COORDONNEE), < AVEC : KS>KU... < DE PLUS IL EST ADAPTE A 'T6', < CAR IL REDONNE TOUJOURS LES < MEMES NOMBRE ALEATOIRES POUR < UN TRIPLET (VARU,VARV,VARW) < DONNE... < < < ARGUMENT : < A0000=KS(RDN(U)), < A0001=KI(RDN(U)), < A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U', < A0003=KS(RDN(V)), < A0004=KI(RDN(V)), < A0005=MUL(RDN(V)), < A0006=KS(RDN(W)), < A0007=KI(RDN(W)), < A0008=MUL(RDN(W)). A0000:: VAL 0 A0001:: VAL A0000+1 A0002:: VAL A0001+1 A0003:: VAL A0002+1 A0004:: VAL A0003+1 A0005:: VAL A0004+1 A0006:: VAL A0005+1 A0007:: VAL A0006+1 A0008:: VAL A0007+1 < < LOCAL FLOC: EQU $ ASP1: WORD SP1 ASP2: WORD SP2 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 ARDN: WORD SQRDN < GENERATEUR DE NOMBRES ALEATOIRES. XA0000: WORD 0 < BORNE SUPERIEURE, XA0001: WORD 0 < BORNE INFERIEURE... FMUL: FLOAT 0 < MULTIPLICATEUR... INFINI: FLOAT 32768 INFIN2: FLOAT 16384 < INFINI/2... FWORK4: FLOAT 0 FWORK5: FLOAT 0 PROG < < < S / P D E C A L C U L D E S S E U I L S : < < < ARGUMENT : < X=NUMERO DE LA CONSTANTE A RECUPERER, < < < RESULTAT : < A=SEUIL. < < SP1: EQU $ BSR ASPCT < RECUPERATION DE LA CONSTANTE (X), FAD FWORK < +(-ABS(COORDONNEE)), FIX JAGE SP11 LAI 0 < NEGATIF, ON TRONQUE... SP11: EQU $ RSR < < < A C C E S C O O R D O N N E E : < < SP2: EQU $ FABS FNEG FST FWORK RSR < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ SPRDN1: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN SPRDN2: EQU $ FLT FMP F05 < RDN/2, PSR A,B < SAVE RDN/2... FAD INFIN2 < (RDN+INFINI)/2, FST FWORK4 LA XA0000 < BORNE SUPERIEURE, FLT FMP FWORK4 FST FWORK4 PLR A,B < RDN/2, FSB INFIN2 < (RDN-INFINI)/2, FST FWORK5 LA XA0001 < BORNE INFERIEURE, FLT FMP FWORK5 FST FWORK5 FLD FWORK4 FSB FWORK5 FDV INFINI < MISE A L'ECHELLE... FIX CP XA0000 < ??? JG SPRDN3 < ERREUR... CP XA0001 < ??? JL SPRDN3 < ERREUR... FLT FMP FMUL RSR SPRDN3: EQU $ QUIT 1 JMP SPRDN2 < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < SQRDN: EQU $ FLT < FLOTTAISON DU DISCRIMINATEUR DE VARU, < VARV ET VARW... FAD VARU FAD VARV FAD VARW < DISCRIMINATEUR+VARU+VARV+VARW, FST FWORK4 FLD VARU FMP VARV FAD FWORK4 BSR ASIN < DONT ON PREND LE SINUS... EORR B,A < ON CUMULE LES 2 MOTS, JMP SPRDN2 < QUE L'ON CONSIDERE ENTIER... < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ FLD VARV BSR ASP2 < -ABS(VARV). LXI A0000 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0001 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0002 BSR ASPCT FST FMUL LA RDN1 < (A)=DISCRIMINATEUR DE 'VARU'... BSR ARDN FAD VARU RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ FLD VARU BSR ASP2 < -ABS(VARU). LXI A0003 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0004 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0005 BSR ASPCT FST FMUL LA RDN2 < (A)=DISCRIMINATEUR DE 'VARV'... BSR ARDN FAD VARV RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD VARW BSR ASP2 < -ABS(VARW). LXI A0006 BSR ASP1 < CALCUL DU SEUIL... STA XA0000 < BORNE SUPERIEURE, LXI A0007 BSR ASP1 < CALCUL DU SEUIL... STA XA0001 < ET BORNE INFERIEURE... LXI A0008 BSR ASPCT FST FMUL LA RDN4 < (A)=DISCRIMINATEUR DE 'VARW'... BSR ARDN FAD VARW RSR :F :F < <<'SIOT RDN 5' DF'SIOT RDN 6' ED'SIOT RDN 6' IN0 PAGE IDP "SIOT RDN 6" < < < R D N 6 : < P O I N T S A L E A T O I R E S : < ( T 6 ) < < < FONCTION : < LA FONCTION DEVELOPPE DONNE UN < VECTEUR DE COMPOSANTES ALEATOIRES ; < IL RENORMALISE A PRIORI LES COMPO- < SANTES ALEATOIRES DANS LE SEGMENT < (INF,SUP). < CE GENERATEUR DONNE POUR CHAQUE < TRIPLET (VARU,VARV,VARW) UN < VECTEUR ALEATOIRE FONCTION UNIQUEMENT < DU POINT COURANT... < < < ARGUMENT : < A0000=BORNE SUPERIEURE DE RDN(U), < A0001=BORNE INFERIEURE DE RDN(U), < A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U', < A0003=SUP(RDN(V)), < A0004=INF(RDN(V)), < A0005=MUL(RDN(V)), < A0006=SUP(RDN(W)), < A0007=INF(RDN(W)), < A0008=MUL(RDN(W)). A0000:: VAL 0 A0001:: VAL A0000+1 A0002:: VAL A0001+1 A0003:: VAL A0002+1 A0004:: VAL A0003+1 A0005:: VAL A0004+1 A0006:: VAL A0005+1 A0007:: VAL A0006+1 A0008:: VAL A0007+1 < < LOCAL FLOC: EQU $ 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 ARDN: WORD SQRDN < GENERATEUR DE NOMBRES ALEATOIRES. XA0000: WORD 0 < BORNE SUPERIEURE, XA0001: WORD 0 < BORNE INFERIEURE... FMUL: FLOAT 0 < MULTIPLICATEUR... INFINI: FLOAT 32768 INFIN2: FLOAT 16384 < INFINI/2... FWORK4: FLOAT 0 FWORK5: FLOAT 0 PROG < < < G E N E R A T E U R A L E A T O I R E : < < SPRDN: EQU $ SPRDN1: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... EOR MCDAR MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA F1 < REINITIALISATION... EOR XR AD F1+1 < ???? AD RDN2 SPMOYC: EQU $ STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS EOR MCDAV SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA F1 EOR YR EOR F1+1 AD RDN2 SPMOYF: EQU $ STA RDN4 EOR MCDAB EOR RDN SPRDN2: EQU $ FLT FMP F05 < RDN/2, PSR A,B < SAVE RDN/2... FAD INFIN2 < (RDN+INFINI)/2, FST FWORK4 LA XA0000 < BORNE SUPERIEURE, FLT FMP FWORK4 FST FWORK4 PLR A,B < RDN/2, FSB INFIN2 < (RDN-INFINI)/2, FST FWORK5 LA XA0001 < BORNE INFERIEURE, FLT FMP FWORK5 FST FWORK5 FLD FWORK4 FSB FWORK5 FDV INFINI < MISE A L'ECHELLE... FIX CP XA0000 < ??? JG SPRDN3 < ERREUR... CP XA0001 < ??? JL SPRDN3 < ERREUR... FLT FMP FMUL RSR SPRDN3: EQU $ QUIT 1 JMP SPRDN2 < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < SQRDN: EQU $ FLT < FLOTTAISON DU DISCRIMINATEUR DE VARU, < VARV ET VARW... FAD VARU FAD VARV FAD VARW < DISCRIMINATEUR+VARU+VARV+VARW, FST FWORK4 FLD VARU FMP VARV FAD FWORK4 BSR ASIN < DONT ON PREND LE SINUS... EORR B,A < ON CUMULE LES 2 MOTS, JMP SPRDN2 < QUE L'ON CONSIDERE ENTIER... < < < C O M P O S A N T E ' U ' : < < SPU: EQU $ LXI A0000 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0001 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0002 BSR ASPCT FST FMUL LA RDN1 BSR ARDN FAD VARU RSR < < < C O M P O S A N T E ' V ' : < < SPV: EQU $ LXI A0003 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0004 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0005 BSR ASPCT FST FMUL LA RDN2 BSR ARDN FAD VARV RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ LXI A0006 BSR ASPCT FIX STA XA0000 < BORNE SUPERIEURE, LXI A0007 BSR ASPCT FIX STA XA0001 < ET BORNE INFERIEURE... LXI A0008 BSR ASPCT FST FMUL LA RDN4 BSR ARDN FAD VARW RSR :F :F < <<'SIOT RDN 6' DF'SIOT ROTATION OX' ED'SIOT ROTATION OX' IN0 PAGE IDP "SIOT ROTATION OX" < < < R O T A T I O N A U T O U R D E L ' A X E O X : < < < FONCTION : < CE MODULE PERMET DE FAIRE < TOURNER L'IMAGE AUTOUR DE < L'AXE OX D'UN ANGLE QUELCONQUE : < X=U, < Y=V*COS(TETA), < Z=V*SIN(TETA). < < < PARAMETRE : A0:: VAL 0 < ANGLE DE LA ROTATION 'TETA' EN RADIAN; < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ FLD VARU < X=U... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI A0 BSR ASPCT < TETA, BSR ACOS < COS(TETA), FMP VARV < Y=V*COS(TETA). RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ LXI A0 BSR ASPCT < TETA, BSR ASIN < SIN(TETA), FMP VARV < Z=V*SIN(TETA). RSR :F :F < <<'SIOT ROTATION OX' DF'SIOT TOURBILLONS 1' ED'SIOT TOURBILLONS 1' IN0 PAGE IDP "SIOT TOURBILLONS 1" < < < T O U R B I L L O N S 1 : < < < MODELE : < ON CONSIDERE LA FONCTION : D=R/(R**2+1), < SA COURBE REPRESENTATIVE EST UNE FONCTION < DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2), < UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION. < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y) < ORTHOGONAL AU RAYON POLAIRE 'RHO' ; CE VECTEUR < DEPLACEMENT A POUR COORDONNEES : < U=-Y/(RHO**2+1), < V=+X/(RHO**2+1), < W=0, < < LOCAL FLOC: EQU $ RHO2P1: FLOAT 0 ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD VARU FMP VARU FST FWORK FLD VARV FMP VARV FAD FWORK FAD F1 FST RHO2P1 < RHO2P1=VARU**2+VARV**2+1. RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ BSR ASPRHO FLD VARV FNEG FDV RHO2P1 < -VARV/RHO2P1. RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ BSR ASPRHO FLD VARU FDV RHO2P1 < VARV/RHO2P1. RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT TOURBILLONS 1' DF'SIOT TOURBILLONS 2' ED'SIOT TOURBILLONS 2' IN0 PAGE IDP "SIOT TOURBILLONS 2" < < < T O U R B I L L O N S 2 : < < < MODELE : < ON CONSIDERE LA FONCTION : D=R/(R**2+1), < SA COURBE REPRESENTATIVE EST UNE FONCTION < DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2), < UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION. < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y) < ORTHOGONAL AU RAYON POLAIRE 'RHO' ; CE VECTEUR < DEPLACEMENT A POUR COORDONNEES : < U=-Y/(RHO**2+1), < V=+X/(RHO**2+1), < W=0, < NOTA : < SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON- < FLOTTANTES DES POINTS DE L'IMAGE, < SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE < A PARTIR DES COORDONNEES STOCKEES DANS < LE Z-BUFFER. < < LOCAL FLOC: EQU $ RHO2P1: FLOAT 0 ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. ASP1: WORD SP1 < RANGEMENT DANS LE Z-BUFFER, ASP2: WORD SP2 < ACCES A UN MOT DU Z-BUFFER. ASP3: WORD SP3 < ACCES A 4-MOTS DU Z-BUFFER. NPTS: WORD 0 < NOMBRE DE POINTS DANS L'IMAGE DE BASE. XNPTS: WORD 0 < NOMBRE COURANT DE POINTS TRAITES LORS < D'UNE ITERATION. XAD1: WORD 0 < ADRESSE COURANTE DE RANGEMENT, XAD2: WORD 0 < ADRESSE COURANTE D'ACCES. PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD VARU FMP VARU FST FWORK FLD VARV FMP VARV FAD FWORK FAD F1 FST RHO2P1 < RHO2P1=VARU**2+VARV**2+1. RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ LXI 0 BSR ASPCT < ACCES A 'A 0000' : FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPU1 < NON... < < CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER : < IC NPTS < COMPTAGE DES POINTS RENCONTRES. FLD VARU BSR ASP1 < RANGEMENT DE B(VARU), LR A,B BSR ASP1 < RANGEMENT DE A(VARU), FLD VARV BSR ASP1 < RANGEMENT DE B(VARV), LR A,B BSR ASP1 < RANGEMENT DE A(VARV). FLD F0 < PAS DE DEPLACEMENT LA PREMIERE FOIS... JMP SPU2 < ET C'EST TOUT... < < CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER : < SPU1: EQU $ IC XNPTS < COMPTAGE DES POINTS DE CETTE ITERATION... BSR ASP3 < ACCES A VARU ET VARV. LA XAD2 ADRI -4,A < CAR ON VA RE-UTILISER CE BLOC... STA XAD2 BSR ASPRHO FLD VARV FNEG FDV RHO2P1 < -VARV/RHO2P1. SPU2: EQU $ RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI 0 BSR ASPCT FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPV1 < NON... < < CAS DE LA PREMIERE FOIS : < FLD F0 < OUI, PAS DE DEPLACEMENT... JMP SPV2 < < CAS DES ITERATIONS SUIVANTES : < SPV1: EQU $ BSR ASP3 < ACCES A VARU ET VARV. LA NPTS CP XNPTS < EST-ON AU BOUT DE L'IMAGE ??? JNE SPV3 < NON... STZ XNPTS < OUI, ON REINITIALISE LES COMPTEURS, STZ XAD2 < ET LES ADRESSES... SPV3: EQU $ FLD FXS FMP KFU < ON SUPPOSE QUE KUX=KUY=1... BSR ASP1 < RANGEMENT DE B(FXS), LR A,B BSR ASP1 < RANGEMENT DE A(FXS), FLD FYS FMP KFV < ON SUPPOSE QUE KVX=KVY=1... BSR ASP1 < RANGEMENT DE B(FYS), LR A,B BSR ASP1 < RANGEMENT DE A(FYS). LA XNPTS < EST-ON AU DEBUT ??? CPI 1 JNE SPU4 < NON... STZ XAD1 < OUI, REINITIALISATION DE L'ADRESSE... SPU4: EQU $ BSR ASPRHO FLD VARU FDV RHO2P1 < VARU/RHO2P1. SPV2: EQU $ RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < S T O R E D A N S L E Z - B U F F E R : < < < ARGUMENT : < B=VALEUR A RANGER, < XAD1=ADRESSE DE RANGEMENT. < < SP1: EQU $ CPZ ZBUF < Z-BUFFER ??? JNE SP11 < OK, INACTIF... QUIT 1 < ACTIF ??!???! SP11: EQU $ STZ ZBUF < ACTIVATION... PSR A LA XAD1 < A=ADRESSE DE RANGEMENT, LYI YSTORE < Y=FONCTION DE RANGEMENT, BSR AGZB < RANGEMENT DE LA VALEUR (B). PLR A IC XAD1 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A U Z - B U F F E R : < < < ARGUMENT : < XAD2=ADRESSE D'ACCES. < < < RESULTAT : < B=VALEUR. < < SP2: EQU $ STZ ZBUF < ACTIVATION DU Z-BUFFER... PSR A LA XAD2 < A=ADRESSE D'ACCES, LYI YLOAD < Y=FONCTION D'ACCES, BSR AGZB < B=VALEUR. PLR A IC XAD2 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A V A R U E T V A R V : < E T X R E T Y R : < < SP3: EQU $ BSR ASP2 < ACCES A B(VARU), LR B,A BSR ASP2 < ACCES A A(VARU), XR A,B FST VARU < ACCES A VARU, FDV KFU < ON SUPPOSE KUX=KUY=1... FST FXR BSR ASP2 < ACCES A B(VARV), LR B,A BSR ASP2 < ACCES A A(VARV), XR A,B FST VARV < ACCES A VARV. FDV KFV < ON SUPPOSE KVX=KVY=1... FST FYR RSR :F :F < <<'SIOT TOURBILLONS 2' DF'SIOT TOURBILLONS 3' ED'SIOT TOURBILLONS 3' IN0 PAGE IDP "SIOT TOURBILLONS 3" < < < T O U R B I L L O N S 3 : < < < MODELE : < ON CONSIDERE LA FONCTION : D=R/(R**2+1), < SA COURBE REPRESENTATIVE EST UNE FONCTION < DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2), < UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION. < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN DEPLACEMENT DU POINT (X,Y), < SUIVANT LA LOI : < (X) (COS(D) -SIN(D)) (X) < ( ) = ( )*( ) < (Y) (SIN(D) COS(D)) (Y) < W=0, < NOTA : < SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON- < FLOTTANTES DES POINTS DE L'IMAGE, < SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE < A PARTIR DES COORDONNEES STOCKEES DANS < LE Z-BUFFER. < A0001=FACTEUR D'ECHELLE DE L'ANGLE 'D'. < < LOCAL FLOC: EQU $ XCOS: EQU DXDU < COS(D). XSIN: EQU DXDV < SIN(D). ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. ASP1: WORD SP1 < RANGEMENT DANS LE Z-BUFFER, ASP2: WORD SP2 < ACCES A UN MOT DU Z-BUFFER. ASP3: WORD SP3 < ACCES A 4-MOTS DU Z-BUFFER. NPTS: EQU DYDU+1 < NOMBRE DE POINTS DANS L'IMAGE DE BASE. XNPTS: EQU DYDV+1 < NOMBRE COURANT DE POINTS TRAITES LORS < D'UNE ITERATION. XAD1: EQU DZDU+1 < ADRESSE COURANTE DE RANGEMENT, XAD2: EQU DZDV+1 < ADRESSE COURANTE D'ACCES. A0:: VAL 0 < INDICATEUR D'INITIALISATION. A1:: VAL 1 < CONSTANTE D'ECHELLE DE 'D'... PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD VARU FMP VARU FST FWORK FLD VARV FMP VARV FAD FWORK FAD F1 FST FWORK2 < U**2+V**2+1. FSB F1 BSR ARAC FST FWORK1 < RAC(U**2+V**2). LXI A1 BSR ASPCT FMP FWORK1 FDV FWORK2 FST FWORK BSR ACOS FST XCOS < XCOS=COS(A1*RAC(U**2+V**2)/(U**2+V**2+1). FLD FWORK BSR ASIN FST XSIN < XSIN=SIN(A1*RAC(U**2+V**2)/(U**2+V**2+1). RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT < ACCES A 'A 0000' : FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPU1 < NON... < < CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER : < IC NPTS < COMPTAGE DES POINTS RENCONTRES. FLD VARU BSR ASP1 < RANGEMENT DE B(VARU), LR A,B BSR ASP1 < RANGEMENT DE A(VARU), FLD VARV BSR ASP1 < RANGEMENT DE B(VARV), LR A,B BSR ASP1 < RANGEMENT DE A(VARV). FLD F0 < PAS DE DEPLACEMENT LA PREMIERE FOIS... JMP SPU2 < ET C'EST TOUT... < < CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER : < SPU1: EQU $ IC XNPTS < COMPTAGE DES POINTS DE CETTE ITERATION... BSR ASP3 < ACCES A VARU ET VARV. LA XAD2 ADRI -4,A < CAR ON VA RE-UTILISER CE BLOC... STA XAD2 BSR ASPRHO < CALCUL DE 'XSIN' ET 'XCOS'. FLD XSIN FMP VARV FST FWORK FLD XCOS FMP VARU FSB FWORK FDV KFU FSB FXR FDV FK SPU2: EQU $ RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI A0 BSR ASPCT FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPV1 < NON... < < CAS DE LA PREMIERE FOIS : < FLD F0 < OUI, PAS DE DEPLACEMENT... JMP SPV2 < < CAS DES ITERATIONS SUIVANTES : < SPV1: EQU $ BSR ASP3 < ACCES A VARU ET VARV. LA NPTS CP XNPTS < EST-ON AU BOUT DE L'IMAGE ??? JNE SPV3 < NON... STZ XNPTS < OUI, ON REINITIALISE LES COMPTEURS, STZ XAD2 < ET LES ADRESSES... SPV3: EQU $ FLD FXS FMP KFU < ON SUPPOSE QUE KUX=KUY=1... BSR ASP1 < RANGEMENT DE B(FXS), LR A,B BSR ASP1 < RANGEMENT DE A(FXS), FLD FYS FMP KFV < ON SUPPOSE QUE KVX=KVY=1... BSR ASP1 < RANGEMENT DE B(FYS), LR A,B BSR ASP1 < RANGEMENT DE A(FYS). LA XNPTS < EST-ON AU DEBUT ??? CPI 1 JNE SPU4 < NON... STZ XAD1 < OUI, REINITIALISATION DE L'ADRESSE... SPU4: EQU $ FLD XSIN FMP VARU FST FWORK FLD XCOS FMP VARV FAD FWORK FDV KFV FSB FYR FDV FK SPV2: EQU $ RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < S T O R E D A N S L E Z - B U F F E R : < < < ARGUMENT : < B=VALEUR A RANGER, < XAD1=ADRESSE DE RANGEMENT. < < SP1: EQU $ CPZ ZBUF < Z-BUFFER ??? JNE SP11 < OK, INACTIF... QUIT 1 < ACTIF ??!???! SP11: EQU $ STZ ZBUF < ACTIVATION... PSR A LA XAD1 < A=ADRESSE DE RANGEMENT, LYI YSTORE < Y=FONCTION DE RANGEMENT, BSR AGZB < RANGEMENT DE LA VALEUR (B). PLR A IC XAD1 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A U Z - B U F F E R : < < < ARGUMENT : < XAD2=ADRESSE D'ACCES. < < < RESULTAT : < B=VALEUR. < < SP2: EQU $ STZ ZBUF < ACTIVATION DU Z-BUFFER... PSR A LA XAD2 < A=ADRESSE D'ACCES, LYI YLOAD < Y=FONCTION D'ACCES, BSR AGZB < B=VALEUR. PLR A IC XAD2 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A V A R U E T V A R V : < E T X R E T Y R : < < SP3: EQU $ BSR ASP2 < ACCES A B(VARU), LR B,A BSR ASP2 < ACCES A A(VARU), XR A,B FST VARU < ACCES A VARU, FDV KFU < ON SUPPOSE KUX=KUY=1... FST FXR BSR ASP2 < ACCES A B(VARV), LR B,A BSR ASP2 < ACCES A A(VARV), XR A,B FST VARV < ACCES A VARV. FDV KFV < ON SUPPOSE KVX=KVY=1... FST FYR RSR :F :F < <<'SIOT TOURBILLONS 3' DF'SIOT TOURBILLONS 4' ED'SIOT TOURBILLONS 4' IN0 PAGE IDP "SIOT TOURBILLONS 4" < < < T O U R B I L L O N S 4 : < < < MODELE : < ON CONSIDERE LA FONCTION : D=A2*(A1*R-R**2), < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN DEPLACEMENT DU POINT (X,Y), < SUIVANT LA LOI : < (X) (COS(D) -SIN(D)) (X) < ( ) = ( )*( ) < (Y) (SIN(D) COS(D)) (Y) < NOTA : < SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON- < FLOTTANTES DES POINTS DE L'IMAGE, < SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE < A PARTIR DES COORDONNEES STOCKEES DANS < LE Z-BUFFER. < A0001=FACTEUR D'ECHELLE DE L'ANGLE 'D'. < < LOCAL FLOC: EQU $ XCOS: EQU DXDU < COS(D). XSIN: EQU DXDV < SIN(D). ASP1: WORD SP1 < RANGEMENT DE 'A' DANS LE Z-BUFFER, ASP4: WORD SP4 < RANGEMENT DE (A,B) DANS LE Z-BUFFER, ASP2: WORD SP2 < ACCES A UN MOT DU Z-BUFFER. ASP3: WORD SP3 < ACCES A 4-MOTS DU Z-BUFFER. NPTS: EQU DYDU+1 < NOMBRE DE POINTS DANS L'IMAGE DE BASE. XNPTS: EQU DYDV+1 < NOMBRE COURANT DE POINTS TRAITES LORS < D'UNE ITERATION. XAD1: EQU DZDU+1 < ADRESSE COURANTE DE RANGEMENT, XAD2: EQU DZDV+1 < ADRESSE COURANTE D'ACCES. A0:: VAL 0 < INDICATEUR D'INITIALISATION. A1:: VAL 1 A2:: VAL 2 < CONSTANTE D'ECHELLE. PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ LXI A0 BSR ASPCT < ACCES A 'A 0000' : FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPU1 < NON... < < CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER : < IC NPTS < COMPTAGE DES POINTS RENCONTRES. FLD VARU BSR ASP4 < RANGEMENT DE 'VARU'. FLD VARV BSR ASP4 < RANGEMENT DE 'VARV'. FLD F0 < PAS DE DEPLACEMENT LA PREMIERE FOIS... JMP SPU2 < ET C'EST TOUT... < < CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER : < SPU1: EQU $ IC XNPTS < COMPTAGE DES POINTS DE CETTE ITERATION... BSR ASP3 < ACCES A VARU ET VARV. LA XAD2 ADRI -4,A < CAR ON VA RE-UTILISER CE BLOC... STA XAD2 FLD VARU FMP VARU FST FWORK FLD VARV FMP VARV FAD FWORK FST FWORK2 < U**2+V*2. BSR ARAC FST FWORK1 < RHO=RAC(U**2+V**2). LXI A1 BSR ASPCT FMP FWORK1 FSB FWORK2 FCAZ JGE SPRHO1 FLD F0 < SUPPRESSION DES VALEURS NEGATIVES... SPRHO1: EQU $ FST FWORK LXI A2 BSR ASPCT FMP FWORK FST FWORK < TETA=A2*(A1*RHO-RHO**2). BSR ACOS FST XCOS < XCOS=COS(TETA), FLD FWORK BSR ASIN FST XSIN < XSIN=SIN(TETA). FLD XSIN FMP VARV FST FWORK FLD XCOS FMP VARU FSB FWORK FDV KFU FSB FXR FDV FK SPU2: EQU $ RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI A0 BSR ASPCT FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPV1 < NON... < < CAS DE LA PREMIERE FOIS : < FLD F0 < OUI, PAS DE DEPLACEMENT... JMP SPV2 < < CAS DES ITERATIONS SUIVANTES : < SPV1: EQU $ BSR ASP3 < ACCES A VARU ET VARV. LA NPTS CP XNPTS < EST-ON AU BOUT DE L'IMAGE ??? JNE SPV3 < NON... STZ XNPTS < OUI, ON REINITIALISE LES COMPTEURS, STZ XAD2 < ET LES ADRESSES... SPV3: EQU $ FLD FXS FMP KFU < ON SUPPOSE QUE KUX=KUY=1... BSR ASP4 < RANGEMENT DE 'FXS'. FLD FYS FMP KFV < ON SUPPOSE QUE KVX=KVY=1... BSR ASP4 < RANGEMENT DE 'FYS'. LA XNPTS < EST-ON AU DEBUT ??? CPI 1 JNE SPU4 < NON... STZ XAD1 < OUI, REINITIALISATION DE L'ADRESSE... SPU4: EQU $ FLD XSIN FMP VARU FST FWORK FLD XCOS FMP VARV FAD FWORK FDV KFV FSB FYR FDV FK SPV2: EQU $ RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < S T O R E D A N S L E Z - B U F F E R : < < < ARGUMENT : < B=VALEUR A RANGER, < XAD1=ADRESSE DE RANGEMENT. < < SP1: EQU $ CPZ ZBUF < Z-BUFFER ??? JNE SP11 < OK, INACTIF... QUIT 1 < ACTIF ??!???! SP11: EQU $ STZ ZBUF < ACTIVATION... PSR A LA XAD1 < A=ADRESSE DE RANGEMENT, LYI YSTORE < Y=FONCTION DE RANGEMENT, BSR AGZB < RANGEMENT DE LA VALEUR (B). PLR A IC XAD1 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR SP4: EQU $ BSR ASP1 < RANGEMENT DE 'B', LR A,B BSR ASP1 < RANGEMENT DE 'A'. RSR < < < A C C E S A U Z - B U F F E R : < < < ARGUMENT : < XAD2=ADRESSE D'ACCES. < < < RESULTAT : < B=VALEUR. < < SP2: EQU $ STZ ZBUF < ACTIVATION DU Z-BUFFER... PSR A LA XAD2 < A=ADRESSE D'ACCES, LYI YLOAD < Y=FONCTION D'ACCES, BSR AGZB < B=VALEUR. PLR A IC XAD2 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A V A R U E T V A R V : < E T X R E T Y R : < < SP3: EQU $ BSR ASP2 < ACCES A B(VARU), LR B,A BSR ASP2 < ACCES A A(VARU), XR A,B FST VARU < ACCES A VARU, FDV KFU < ON SUPPOSE KUX=KUY=1... FST FXR BSR ASP2 < ACCES A B(VARV), LR B,A BSR ASP2 < ACCES A A(VARV), XR A,B FST VARV < ACCES A VARV. FDV KFV < ON SUPPOSE KVX=KVY=1... FST FYR RSR :F :F < <<'SIOT TOURBILLONS 4' DF'SIOT TOURBILLONS 5' ED'SIOT TOURBILLONS 5' IN0 PAGE IDP "SIOT TOURBILLONS 5" < < < T O U R B I L L O N S 5 : < < < MODELE : < ON CONSIDERE LA FONCTION : D=R/(R**2+1), < SA COURBE REPRESENTATIVE EST UNE FONCTION < DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2), < UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION. < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y) < ORIENTE DE 'TETA' PAR RAPPORT AU RAYON ; CE VECTEUR < DEPLACEMENT A POUR COORDONNEES : < U=-A1*(X*COS(TETA)-Y*SIN(TETA))/(RHO**2+1), < V=+A2*(X*SIN(TETA)+Y*COS(TETA))/(RHO**2+1), < W=0, < NOTA : < SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON- < FLOTTANTES DES POINTS DE L'IMAGE, < SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE < A PARTIR DES COORDONNEES STOCKEES DANS < LE Z-BUFFER. < < < PARAMETRES : A0:: VAL 0 < INDICATEUR DE PREMIERE FOIS (0), A1:: VAL A0+1 < AMPLIFICATEUR DE 'U', A2:: VAL A1+1 < AMPLIFICATEUR DE 'V', A3:: VAL A2+1 < ANGLE 'TETA' DE LA ROTATION. AN:: VAL A3+1 < LAST PARAMETER... LFLOAT:: VAL 2 < LONGUEUR D'UNE CONSTANTE FLOTTANTE. < < LOCAL FLOC: EQU $ RHO2P1: FLOAT 0 ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. ASP1: WORD SP1 < RANGEMENT DANS LE Z-BUFFER, ASP2: WORD SP2 < ACCES A UN MOT DU Z-BUFFER. ASP3: WORD SP3 < ACCES A 4-MOTS DU Z-BUFFER. NPTS: WORD 0 < NOMBRE DE POINTS DANS L'IMAGE DE BASE. XNPTS: WORD 0 < NOMBRE COURANT DE POINTS TRAITES LORS < D'UNE ITERATION. XAD1: WORD 0 < ADRESSE COURANTE DE RANGEMENT, XAD2: WORD 0 < ADRESSE COURANTE D'ACCES. FA1: FLOAT 0 FA2: FLOAT 0 COSTET: FLOAT 0 < COS(TETA), SINTET: FLOAT 1 < SIN(TETA). PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD VARU FMP VARU FST FWORK FLD VARV FMP VARV FAD FWORK FAD F1 FST RHO2P1 < RHO2P1=VARU**2+VARV**2+1. RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < ENTREE DES COEFFICIENTS D'AMPLIFICATION : < LXI A1 BSR ASPCT FST FA1 LXI A2 BSR ASPCT FST FA2 < < ANGLE 'TETA' DE ROTATION : < LXI A3 BSR ASPCT PSR A,B < 'TETA', BSR ACOS FST COSTET < COS(TETA), PLR A,B BSR ASIN FST SINTET < SIN(TETA). LXI A0 BSR ASPCT < ACCES A 'A 0000' : FCAZ < EST-CE LA PREMIERE FOIS ??? JNE SPU1 < NON... < < CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER : < IC NPTS < COMPTAGE DES POINTS RENCONTRES. FLD VARU BSR ASP1 < RANGEMENT DE B(VARU), LR A,B BSR ASP1 < RANGEMENT DE A(VARU), FLD VARV BSR ASP1 < RANGEMENT DE B(VARV), LR A,B BSR ASP1 < RANGEMENT DE A(VARV). JMP SPW < PAS DE DEPLACEMENT LA PREMIERE FOIS... < < CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER : < SPU1: EQU $ IC XNPTS < COMPTAGE DES POINTS DE CETTE ITERATION... BSR ASP3 < ACCES A VARU ET VARV. LA XAD2 ADRI -4,A < CAR ON VA RE-UTILISER CE BLOC... STA XAD2 BSR ASPRHO FLD VARV FMP SINTET < V*SIN(TETA), FST FWORK FLD VARU FMP COSTET < U*COS(TETA), FSB FWORK < U*COS(TETA)-V*SIN(TETA), FDV RHO2P1 < (U*COS(TETA)-V*SIN(TETA))/RHO2P1. FMP FA1 < AMPLIFICATION... SPU2: EQU $ RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ LXI A0 BSR ASPCT FCAZ < EST-CE LA PREMIERE FOIS ??? JE SPW < OUI, PAS DE DEPLACEMENT... < < CAS DES ITERATIONS SUIVANTES : < SPV1: EQU $ BSR ASP3 < ACCES A VARU ET VARV. LA NPTS CP XNPTS < EST-ON AU BOUT DE L'IMAGE ??? JNE SPV3 < NON... STZ XNPTS < OUI, ON REINITIALISE LES COMPTEURS, STZ XAD2 < ET LES ADRESSES... SPV3: EQU $ FLD FXS FMP KFU < ON SUPPOSE QUE KUX=KUY=1... BSR ASP1 < RANGEMENT DE B(FXS), LR A,B BSR ASP1 < RANGEMENT DE A(FXS), FLD FYS FMP KFV < ON SUPPOSE QUE KVX=KVY=1... BSR ASP1 < RANGEMENT DE B(FYS), LR A,B BSR ASP1 < RANGEMENT DE A(FYS). LA XNPTS < EST-ON AU DEBUT ??? CPI 1 JNE SPU4 < NON... STZ XAD1 < OUI, REINITIALISATION DE L'ADRESSE... SPU4: EQU $ BSR ASPRHO FLD VARV FMP COSTET < V*COS(TETA), FST FWORK FLD VARU FMP SINTET < U*SIN(TETA), FAD FWORK < U*SIN(TETA)+V*COS(TETA), FDV RHO2P1 < (U*SIN(TETA)+V*COS(TETA))/RHO2P1. FMP FA2 < AMPLIFICATION... SPV2: EQU $ RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < S T O R E D A N S L E Z - B U F F E R : < < < ARGUMENT : < B=VALEUR A RANGER, < XAD1=ADRESSE DE RANGEMENT. < < SP1: EQU $ CPZ ZBUF < Z-BUFFER ??? JNE SP11 < OK, INACTIF... QUIT 1 < ACTIF ??!???! SP11: EQU $ STZ ZBUF < ACTIVATION... PSR A LA XAD1 < A=ADRESSE DE RANGEMENT, LYI YSTORE < Y=FONCTION DE RANGEMENT, BSR AGZB < RANGEMENT DE LA VALEUR (B). PLR A IC XAD1 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A U Z - B U F F E R : < < < ARGUMENT : < XAD2=ADRESSE D'ACCES. < < < RESULTAT : < B=VALEUR. < < SP2: EQU $ STZ ZBUF < ACTIVATION DU Z-BUFFER... PSR A LA XAD2 < A=ADRESSE D'ACCES, LYI YLOAD < Y=FONCTION D'ACCES, BSR AGZB < B=VALEUR. PLR A IC XAD2 < PROGRESSION DE L'ADRESSE... IC ZBUF < INHIBITION DU Z-BUFFER... RSR < < < A C C E S A V A R U E T V A R V : < E T X R E T Y R : < < SP3: EQU $ BSR ASP2 < ACCES A B(VARU), LR B,A BSR ASP2 < ACCES A A(VARU), XR A,B FST VARU < ACCES A VARU, FDV KFU < ON SUPPOSE KUX=KUY=1... FST FXR BSR ASP2 < ACCES A B(VARV), LR B,A BSR ASP2 < ACCES A A(VARV), XR A,B FST VARV < ACCES A VARV. FDV KFV < ON SUPPOSE KVX=KVY=1... FST FYR RSR :F :F < <<'SIOT TOURBILLONS 5' DF'SIOT VASARELY' ED'SIOT VASARELY' IN0 PAGE IDP "SIOT VASARELY" < < < F O N C T I O N " V A S A R E L Y " : < < < FONCTION : < ON CALCULE LA TRANSFORMATION SUIVANTE : < U=X+(A0*X/(A1*(Y**2)+1)), < V=Y+(A2*Y/(A3*(X**2)+1)), < W=0. < CELA DONNE UNE TRANSFORMATION EXAGERANT < LE CENTRE DE L'IMAGE EN DONNANT UNE < SORTE DE BOURSOUFLURE... < < < PARAMETRES : A0000:: VAL 0 < COEFFICIENT DE X, A0001:: VAL A0000+1 < COEFFICIENT DE Y**2. A0002:: VAL A0001+1 < COEFFICIENT DE Y, A0003:: VAL A0002+1 < COEFFICIENT DE X**2. < < LOCAL FLOC: EQU $ XA0: FLOAT 0 XA1: FLOAT 0 XA2: FLOAT 0 XA3: FLOAT 0 PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < ENTREE DES PARAMETRES : < LXI A0000 BSR ASPCT FST XA0 LXI A0001 BSR ASPCT FST XA1 < < CALCUL DU POINT : < FLD VARV FMP VARV FDV FK FDV FK FMP XA1 FAD F1 FST FWORK FLD VARU FDV FK FMP XA0 FDV FWORK FMP FK FST FWORK FLD VARU FDV FK FAD FWORK RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < ENTREE DES PARAMETRES : < LXI A0002 BSR ASPCT FST XA2 LXI A0003 BSR ASPCT FST XA3 < < CALCUL DU POINT : < FLD VARU FMP VARU FDV FK FDV FK FMP XA3 FAD F1 FST FWORK FLD VARV FDV FK FMP XA2 FDV FWORK FMP FK FST FWORK FLD VARV FDV FK FAD FWORK RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT VASARELY' DF'SIOT VASARELY 1' ED'SIOT VASARELY 1' IN0 PAGE IDP "SIOT VASARELY 1" < < < F O N C T I O N " V A S A R E L Y 1 " : < < < MODELE : < ON CONSIDERE LA FONCTION : D=R/(R**2+1), < SA COURBE REPRESENTATIVE EST UNE FONCTION < DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2), < UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION. < ON CONSIDERE ENSUITE LE RAYON POLAIRE < EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN < COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA). < LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D' < DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y) < COLINEAIRE AU RAYON POLAIRE 'RHO' ; CE VECTEUR < DEPLACEMENT A POUR COORDONNEES : < U=+A0*(A4*X+A5*Y)/(RHO**2+1), < V=+A1*(A6*X+A7*Y)/(RHO**2+1), < W=0, < AVEC : < RHO=A2*(X**2)+A3*(Y**2). < ET : < (A4,A5,A6,A7) EST UNE MATRICE < DE TRANSFORMATION QUI PERMET < PAR EXEMPLE DE FAIRE TOURNER < LA DEFORMATION, EN PRENANT : < < A4=COS(TETA), < A5=-SIN(TETA), < A6=SIN(TETA), < A7=COS(TETA)... < < < NOTA : < C'EST CETTE TRANSFORMATION QUI < PERMET DE FAIRE PARLER, OU CLIGNER < DES YEUX... < < < PARAMETRES : A0:: VAL 0 < COEFFICIENT DE X, A1:: VAL A0+1 < COEFFICIENT DE Y, A2:: VAL A1+1 < COEFFICIENT DE X2, A3:: VAL A2+1 < COEFFICIENT DE Y2, A4:: VAL A3+1 < MATRICE A5:: VAL A4+1 < DE TRANSFORMATION A6:: VAL A5+1 < DES A7:: VAL A6+1 < (X,Y). < < LOCAL FLOC: EQU $ < < CONSTANTES : < PREM: WORD -1 < INDICATEUR DE PREMIER PASSAGE... XFA0: FLOAT 0 XFA1: FLOAT 0 XFA2: FLOAT 0 XFA3: FLOAT 0 XFA4: FLOAT 0 XFA5: FLOAT 0 XFA6: FLOAT 0 XFA7: FLOAT 0 < < RELAIS DIVERS : < RHO2P1: FLOAT 0 ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD XFA2 FMP VARU FMP VARU FDV FK FDV FK FST FWORK FLD XFA3 FMP VARV FMP VARV FDV FK FDV FK FAD FWORK FAD F1 FST RHO2P1 < RHO2P1=1+A2*VARU**2+A3*VARV**2. RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < ENTREE DES PARAMETRES : < CPZ PREM < EST-CE LE PREMIER PASSAGE ??? JGE SPU1 < NON, INUTILE... IC PREM < OUI, ON LE MEMORISE, ET ON ENTRE : LXI A0 BSR ASPCT FST XFA0 LXI A1 BSR ASPCT FST XFA1 LXI A2 BSR ASPCT FST XFA2 LXI A3 BSR ASPCT FST XFA3 LXI A4 BSR ASPCT FST XFA4 LXI A5 BSR ASPCT FST XFA5 LXI A6 BSR ASPCT FST XFA6 LXI A7 BSR ASPCT FST XFA7 < < CALCUL DE 'X' : < SPU1: EQU $ BSR ASPRHO FLD XFA4 < A4, FMP VARU < A4*U, BSR ASFWOR FLD XFA5 < A5, FMP VARV < A5*V, BSR APWORK < A4*U+A5*V, FMP XFA0 < A0*(A4*U+A5*V), FDV FK FDV RHO2P1 < +A0*(A4*U+A5*V)/RHO2P1. FST FWORK FLD VARU < ET ENFIN, "DEFORMATION" DE 'U', FDV FK FAD FWORK < PAR TRANSLATION... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < CALCUL DE 'Y' : < BSR ASPRHO FLD XFA6 < A6, FMP VARU < A6*U, BSR ASFWOR FLD XFA7 < A7, FMP VARV < A7*V, BSR APWORK < A6*U+A7*V, FMP XFA1 < A1*(A6*U+A7*V), FDV FK FDV RHO2P1 < +A1*(A6*U+A7*V)/RHO2P1. FST FWORK FLD VARV < ET ENFIN, "DEFORMATION" DE 'V', FDV FK FAD FWORK < PAR TRANSLATION... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ < < CALCUL DE 'Z' : < FLD F0 RSR :F :F < <<'SIOT VASARELY 1' DF'SIOT VASARELY 2' ED'SIOT VASARELY 2' IN0 PAGE IDP "SIOT VASARELY 2" < < < F O N C T I O N " V A S A R E L Y 2 " : < < < MODELE : < ON CONSIDERE LE VECTEUR < DEPLACEMENT SUIVANT : < < U=(A0+A4*X+A5*Y)/RAC(RHO), < V=(A1+A6*X+A7*Y)/RAC(RHO), < W=0, < AVEC : < RHO=A8+A2*(X**2)+A3*(Y**2). < EN REALITE, LE SIGNE AFFECTE < AUX COMPOSANTES DU VECTEUR < DEPLACEMENT EST CELUI DES < COORDONNEES : 'U' EST DU SIGNE < DE 'X' ET 'V' DE CELUI DE < 'Y'... < ET : < (A4,A5,A6,A7) EST UNE MATRICE < DE TRANSFORMATION QUI PERMET < PAR EXEMPLE DE FAIRE TOURNER < LA DEFORMATION, EN PRENANT : < < A4=COS(TETA), < A5=-SIN(TETA), < A6=SIN(TETA), < A7=COS(TETA)... < < < PARAMETRES : A0:: VAL 0 A1:: VAL A0+1 A2:: VAL A1+1 < COEFFICIENT DE X2, A3:: VAL A2+1 < COEFFICIENT DE Y2, A4:: VAL A3+1 < MATRICE A5:: VAL A4+1 < DE TRANSFORMATION A6:: VAL A5+1 < DES A7:: VAL A6+1 < (X,Y). A8:: VAL A7+1 < < LOCAL FLOC: EQU $ < < CONSTANTES : < PREM: WORD -1 < INDICATEUR DE PREMIER PASSAGE... XFA0: FLOAT 0 XFA1: FLOAT 0 XFA2: FLOAT 0 XFA3: FLOAT 0 XFA4: FLOAT 0 XFA5: FLOAT 0 XFA6: FLOAT 0 XFA7: FLOAT 0 XFA8: FLOAT 0 < < RELAIS DIVERS : < RHO2P1: FLOAT 0 ASPRHO: WORD SPRHO < CALCUL DU RAYON POLAIRE. PROG < < < C A L C U L D E R H O * * 2 + 1 : < < SPRHO: EQU $ FLD XFA2 < A2, FMP VARU < A2*X, FMP VARU < A2*X*X, FDV FK FDV FK FST FWORK FLD XFA3 < A3, FMP VARV < A3*Y, FMP VARV < A3*Y*Y, FDV FK FDV FK FAD FWORK < A2*X*X+A3*Y*Y, FAD XFA8 < A8+A2*X*X+A3*Y*Y, BSR ARAC < RAC(A8+A2*X*X+A3*Y*Y), FST RHO2P1 < ET RANGEMENT... RSR < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ < < ENTREE DES PARAMETRES : < CPZ PREM < EST-CE LE PREMIER PASSAGE ??? JGE SPU1 < NON, INUTILE... IC PREM < OUI, ON LE MEMORISE, ET ON ENTRE : LXI A0 BSR ASPCT FST XFA0 LXI A1 BSR ASPCT FST XFA1 LXI A2 BSR ASPCT FST XFA2 LXI A3 BSR ASPCT FST XFA3 LXI A4 BSR ASPCT FST XFA4 LXI A5 BSR ASPCT FST XFA5 LXI A6 BSR ASPCT FST XFA6 LXI A7 BSR ASPCT FST XFA7 LXI A8 BSR ASPCT FST XFA8 < < CALCUL DE 'X' : < SPU1: EQU $ BSR ASPRHO FLD XFA4 < A4, FMP VARU < A4*U, BSR ASFWOR FLD XFA5 < A5, FMP VARV < A5*V, BSR APWORK < A4*U+A5*V, FAD XFA0 < (A0+A4*U+A5*V), FDV FK FDV RHO2P1 < +(A0+A4*U+A5*V)/RHO2P1. FST FWORK FLD VARU < ET ENFIN, "DEFORMATION" DE 'U', FDV FK FCMZ VARU < QUEL EST LE SIGNE DE 'X' ??? JE SPU3 < NUL, ON L'IGNORE... JG SPU2 < POSITIF... FSB FWORK < NEGATIF, ON RETRANCHE LE DEPLACEMENT... JMP SPU3 SPU2: EQU $ FAD FWORK < POSITIF, ON AJOUTE LE DEPLACEMENT... SPU3: EQU $ RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < CALCUL DE 'Y' : < BSR ASPRHO FLD XFA6 < A6, FMP VARU < A6*U, BSR ASFWOR FLD XFA7 < A7, FMP VARV < A7*V, BSR APWORK < A6*U+A7*V, FAD XFA1 < (A1+A6*U+A7*V), FDV FK FDV RHO2P1 < +(A1+A6*U+A7*V)/RHO2P1. FST FWORK FLD VARV < ET ENFIN, "DEFORMATION" DE 'V', FDV FK FCMZ VARV < QUEL EST LE SIGNE DE 'Y' ??? JE SPV3 < NUL, ON L'IGNORE... JG SPV2 < POSITIF... FSB FWORK < NEGATIF, ON RETRANCHE LE DEPLACEMENT... JMP SPV3 SPV2: EQU $ FAD FWORK < POSITIF, ON AJOUTE LE DEPLACEMENT... SPV3: EQU $ RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ < < CALCUL DE 'Z' : < FLD F0 RSR :F :F < <<'SIOT VASARELY 2' DF'SIOT X2+X P' ED'SIOT X2+X P' IN0 PAGE IDP "SIOT X2+X P" < < < F O N C T I O N X * * 2 + X P : < < < MODELE : < ON CALCULE LE VECTEUR DE COMPOSANTES < (U,V,W) TELLES QUE : < U=P**2+P SI P**2+P<0, < =0 SINON... < V=0, < W=0, < AVEC : < P=X-T. < < LOCAL FLOC: EQU $ FWORKX: FLOAT 0 < TRAVAIL... FM1: FLOAT -1 PROG < < < C O M P O S A N T E U : < < SPU: EQU $ FLD VARU FSB VART < ON FORME U-T, FST FWORKX < U-T, FMP FWORKX < (U-T)**2, FAD FWORKX < (U-T)**2+(U-T), FCAZ JG SPU1 < SI FONCTION>0 : ON L'ANNULE... SPU2: EQU $ RSR SPU1: EQU $ FLD F0 < CAS OU LA FONCTION EST NULLE... JMP SPU2 < < < C O M P O S A N T E V : < < SPV: EQU $ FLD F0 < ELLE EST NULLE... RSR < < < C O M P O S A N T E W : < < SPW: EQU $ FLD F0 < ELLE EST NULLE... RSR :F :F < <<'SIOT X2+X P' DF'SIOT X2+X P 2' ED'SIOT X2+X P 2' IN0 PAGE IDP "SIOT X2+X P 2" < < < F O N C T I O N S X * * 2 + X P : < < < MODELE : < ON CALCULE LE VECTEUR DE COMPOSANTES < (U,V,W) TELLES QUE : < U=P**2+P SI P**2+P<0 0 SINON < +Q**2+Q SI Q**2+Q<0 0 SINON. < V=0, < W=0, < AVEC : < P=U-T. < Q=-U-T+2. < < LOCAL FLOC: EQU $ FWORKX: FLOAT 0 < TRAVAIL... FM1: FLOAT -1 FPOLM1: FLOAT <+NPOLM1+1<0<0 PROG < < < C O M P O S A N T E U : < < SPU: EQU $ FLD VARU FSB VART < ON FORME U-T, FST FWORKX < U-T, FMP FWORKX < (U-T)**2, FAD FWORKX < (U-T)**2+(U-T), FCAZ JLE SPU1 < FONCTION NEGATIVE... FLD F0 < SI POSITIVE, ON L'ANNULLE... SPU1: EQU $ FST FWORK FLD FPOLM1 FMP KFU < EN GENERAL 2=256/128... FSB VARU FSB VART FST FWORKX < -U-T+2, FMP FWORKX < (-U-T+2)**2, FAD FWORKX < (-U-T+2)**2+(-U-T+2). FCAZ JLE SPU2 < FONCTION NEGATIVE... FLD F0 < SI POSITIVE, ON L'ANNULE... SPU2: EQU $ FAD FWORK < CUMUL DES 2 FONCTIONS... RSR < < < C O M P O S A N T E V : < < SPV: EQU $ FLD F0 < ELLE EST NULLE... RSR < < < C O M P O S A N T E W : < < SPW: EQU $ FLD F0 < ELLE EST NULLE... RSR :F :F < <<'SIOT X2+X P 2' DF'SIOT X2+X S' ED'SIOT X2+X S' IN0 PAGE IDP "SIOT X2+X S" < < < F O N C T I O N X * * 2 + X S : < < < MODELE : < ON CALCULE LE VECTEUR DE COMPOSANTES < (U,V,W) TELLES QUE : < U=0, < V=P**2+P SI P**2+P<0, < =0 SINON... < W=0, < AVEC : < P=X-T. < < LOCAL FLOC: EQU $ FWORKX: FLOAT 0 < TRAVAIL... FM1: FLOAT -1 PROG < < < C O M P O S A N T E U : < < SPU: EQU $ FLD F0 < ELLE EST NULLE... RSR < < < C O M P O S A N T E V : < < SPV: EQU $ FLD VARU FSB VART < ON FORME U-T, FST FWORKX < U-T, FMP FWORKX < (U-T)**2, FAD FWORKX < (U-T)**2+(U-T), FCAZ JG SPV1 < SI FONCTION>0 : ON L'ANNULE... SPV2: EQU $ RSR SPV1: EQU $ FLD F0 < CAS OU LA FONCTION EST NULLE... JMP SPV2 < < < C O M P O S A N T E W : < < SPW: EQU $ FLD F0 < ELLE EST NULLE... RSR :F :F < <<'SIOT X2+X S' DF'SIOT Y/(X2+1)' ED'SIOT Y/(X2+1)' IN0 PAGE IDP "SIOT Y/(X2+1)" < < < F O N C T I O N Y / ( X * * 2 + 1 ) : < < < FONCTION : < ON CALCULE LE VECTEUR DEPLACEMENT : < U=0, < V=Y/(X**2+1), < W=0. < CELA DONNE UNE TRANSFORMATION EXAGERANT < LE CENTRE DE L'IMAGE SUIVANT UNE DIRECTION < VERTICALE (CF. LE 'Y' MULTIPLICATEUR DE < DE 1/(X**2+1) ). CELA DONNE UNE SORTE < DE BOURSOUFLURE... < < LOCAL FLOC: EQU $ PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ FLD F0 RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ FLD VARU FMP VARU FAD F1 FST FWORK FLD VARV FDV FWORK RSR < < < C O M P O S A N T E ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT Y/(X2+1)' DF'SIOT Z**ALPHA 1' ED'SIOT Z**ALPHA 1' IN0 PAGE IDP "SIOT Z**ALPHA 1" < < < T R A N S F O R M A T I O N Z = Z * * A L P H A : < FONCTION : < CALCULE UNE GENEREALISATION < DE LA TRANSFORMATION COMPLEXE < Z=Z**ALPHA, TELLE QUE : < < X=(RHO**ALPHR)*COS(ALPHT*TETA), < Y=(RHO**ALPHR)*SIN(ALPHT*TETA), < < OU LES EXPOSANTS DE RHO ET TETA < SONT DIFFERENTS L'UN DE L'AUTRE... < < < < < ARGUMENT : A0:: VAL 0 < EXPOSANT 'ALPHR'... A1:: VAL A0+1 < EXPOSANT 'ALPHT'... < < < L O C A L : < < LOCAL FLOC: EQU $ < < CONSTANTES : < PREM: WORD -1 < INDICATEUR DE PREMIER PASSAGE... ALPHR: FLOAT 0 < EXPOSANT DE 'RHO', ALPHT: FLOAT 0 < EXPOSANT DE 'TETA'. FRHO: FLOAT 0 < MODULE DE Z=U+I*V: < RHO=RAC(U*U+V*V). FTETA: FLOAT 0 < ARGUMENT DE Z=U+I*V : < TETA=ARCTG(V/U). FINFIN: FLOAT 1000000 < INFINI... < < RELAIS DE SOUS-PROGRAMMES : < ARAK: WORD RAK < CALCUL D'UNE PUISSANCE QUELCONQUE. AARCTG: WORD ARCTG < CALCUL D'UN ARC-TANGENTE. < < POUR LE CALCUL DU LOGARITHME : < ZZZ001: FLOAT 0 < NB FLOTTANT ZZZ002: FLOAT 0 ZZZ003: FLOAT 0 ZZZ004: WORD '5A00;'8279 < RACINE(2)/2 ZZZ005: WORD '5201;'B046 < CSTES DU DEVELOPPEMENT ZZZ006: WORD '5402;'79B7 ZZZ007: WORD '6A01;'0867 ZZZ008: EQU F05 < CSTE 0.5 ZZZ009: WORD '5800;'B90C < CSTE LN(2) ZZZ010:: VAL 'FF00 < MASQUE. < < POUR LE CALCUL DE L'EXPONENTIELLE : < ZZZ021: EQU ZZZ001 < NB EN FLOTTANT ZZZ022: EQU ZZZ002 ZZZ023: EQU ZZZ003 ZZZ024: WORD '5C01;'551E < LOG A BASE 2 DE E ZZZ025: WORD 0 < RELEVE DE L'EXPOSANT ZZZ026: EQU F1 < 1.0 ZZZ027: WORD '4002;'0000 < 2.0 ZZZ028: WORD '5707;'6AE1 < CSTES DU POLYNOME ZZZ029: WORD '46FC;'FA70 ZZZ030: WORD 'BA0F;'5917 ZZZ031: WORD '4F04;'A303 ZZZ032:: VAL ZZZ010 < MASQUE SIGNE: WORD 0 < POUR DETERMINER LE SIGNE DE X**Y... < < DONNEES POUR LE CALCUL DE ARCTG : < ATGLOC: EQU $ ATGT1: FLOAT 0 < ZONE DE TRAVAIL 1. ATGT2: FLOAT 0 < ZONE DE TRAVAIL 2. ATGT3: FLOAT 0 < ZONE DE TRAVAIL 3. ATGSDX: WORD 0 < INDICATEUR "SIGNE DE X ARGUMENT": < = 0 : POSITIF OU NUL; < < 0 : NEGATIF. ATGPSC: FLOAT 0.0548862 < ^^ TG(PI/12). ATGPS2: FLOAT 1.5707963 < ^^ PI/2. ATGPS3: FLOAT 1.0471975 < ^^ PI/3. ATGPS6: FLOAT 0.5235988 < ^^ PI/6. ATGUN: FLOAT 1.0 ATGR3: FLOAT 1.7320508 < ^^ RACINE DE 3. ATGP1: FLOAT 0.6031058 < COEFFICIENT ATGP2: FLOAT 0.0516045 < DU ATGP3: FLOAT 0.5591371 < POLYNOME ATGP4: FLOAT 1.4087812 < ARCTG(X)=... PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ CPZ PREM < EST-CE LA PREMIERE FOIS ??? JGE SPU1 < CAS DES FOIS SUIVANTES... < < CAS DE LA PREMIERE FOIS : < IC PREM < ON LE MEMORISE... LXI A0 BSR ASPCT FST ALPHR < ENTREE DE L'EXPOSANT DE 'RHO', LXI A1 BSR ASPCT FST ALPHT < ET DE 'TETA'... < < CALCUL DE X=(RHO**ALPHR)*COS(ALPHT*TETA) : < SPU1: EQU $ FLD VARU < U, FMP VARU < U*U, BSR ASFWOR FLD VARV < V, FMP VARV < V*V, BSR APWORK < U*U+V*V, BSR ARAC < RAC(U*U+V*V), FST FRHO < CALCUL DU MODULE DE U+I*V... FLD FINFIN < AU CAS OU U=0 : FCMZ VARV < ET V ??? JGE SPU3 < POSITIF... BSR AFNEG < NEGATIF, ON INVERSE L'INFINI... SPU3: EQU $ FCMZ VARU < U=0 ??? JE SPU2 < ET OUI : V/U=INFINI... FLD VARV < V, FDV VARU < V/U, SPU2: EQU $ BSR AARCTG < ARCTG(V/U), FST FTETA < CALCUL DE L'ARGUMENT DE U+I*V... FMP ALPHT < ALPHT*TETA, BSR ACOS < COS(ALPHT*TETA), BSR ASFWOR FLD FRHO < RHO, BSR ARAK < RHO**ALPHR, FMP FWORK < X=(RHO**ALPHR)*COS(ALPHT*TETA). RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < CALCUL DE Y=(RHO**ALPHR)*SIN(ALPHT*TETA) : < FLD VARU < U, FMP VARU < U*U, BSR ASFWOR FLD VARV < V, FMP VARV < V*V, BSR APWORK < U*U+V*V, BSR ARAC < RAC(U*U+V*V), FST FRHO < CALCUL DU MODULE DE U+I*V... FLD FINFIN < AU CAS OU U=0 : FCMZ VARV < ET V ??? JGE SPV2 < POSITIF... BSR AFNEG < NEGATIF, ON INVERSE L'INFINI... SPV2: EQU $ FCMZ VARU < U=0 ??? JE SPV1 < ET OUI : V/U=INFINI... FLD VARV < V, FDV VARU < V/U, SPV1: EQU $ BSR AARCTG < ARCTG(V/U), FST FTETA < CALCUL DE L'ARGUMENT DE U+I*V... FMP ALPHT < ALPHT*TETA, BSR ASIN < SIN(ALPHT*TETA), BSR ASFWOR FLD FRHO < RHO, BSR ARAK < RHO**ALPHR, FMP FWORK < X=(RHO**ALPHR)*SIN(ALPHT*TETA). RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < C A L C U L D ' U N E P U I S S A N C E < Q U E L C O N Q U E P : < < < ARGUMENT : < (A,B)=NOMBRE 'N' ARGUMENT, < < < RESULTAT : < (A,B)='N' A LA PUISSANCE P. < < RAK: EQU $ < < < L O G N E P E R I E N : < < LOGN: EQU $ STZ SIGNE < =0 : SIGNE "+" A PRIORI... BSR AFCAZ JGE LOGN1 < POSITIF... IC SIGNE < =1 : SIGNE "-"... LOGN1: EQU $ LR A,Y BSR AFABS ANDI ZZZ010 FST ZZZ003 FAD ZZZ004 FST ZZZ002 LR Y,A SWBR A SARS 8 BSR AFLT FST ZZZ001 FLD ZZZ003 FSB ZZZ004 FDV ZZZ002 FST ZZZ003 FMP ZZZ003 BSR AFNEG FAD ZZZ007 FST ZZZ002 FLD ZZZ006 FDV ZZZ002 FAD ZZZ005 FMP ZZZ003 FSB ZZZ008 FAD ZZZ001 FMP ZZZ009 < < < G E S T I O N D E L ' E X P O S A N T : < < FMP ALPHR < ET ON CALCULE ALPHR*LOG... < < < E X P O N E N T I E L L E : < < EXP: EQU $ FMP ZZZ024 FST ZZZ023 BSR AFIX STA ZZZ025 BSR AFLT FCAM ZZZ023 JNV ZZZ033 FLD ZZZ026 FST ZZZ023 JMP ZZZ035 ZZZ033: EQU $ CPZ ZZZ023 JGE ZZZ034 DC ZZZ025 LA ZZZ025 BSR AFLT ZZZ034: EQU $ FSB ZZZ023 BSR AFNEG FST ZZZ022 FMP ZZZ022 FST ZZZ021 FAD ZZZ028 FST ZZZ023 FLD ZZZ030 FDV ZZZ023 FAD ZZZ021 FMP ZZZ029 FAD ZZZ031 FSB ZZZ022 FST ZZZ023 FLD ZZZ027 FMP ZZZ022 FDV ZZZ023 FAD ZZZ026 FST ZZZ023 ZZZ035: EQU $ SWBR A SARS 8 AD ZZZ025 CPI '7F JG $ CPI -'80 JGE ZZZ036 LAI 0 RBT 8 LBI 0 JMP ZZZ037 ZZZ036: EQU $ ANDI 'FF STA ZZZ025 LA ZZZ023 ANDI ZZZ032 AD ZZZ025 ZZZ037: EQU $ CPZ SIGNE < PRISE EN COMPTE DU SIGNE SIMULE : JE EXP1 < POSITIF, ON LAISSE LE RESULTAT TEL QUEL.. BSR AFNEG < NEGATIF, ON INVERSE... EXP1: EQU $ RSR < < < C A L C U L D E A R C T G : < < < ARGUMENT : < (A,B)=TG(TETA), < < < RESULTAT : < (A,B)=TETA. < < ARCTG: EQU $ < E N T R Y ' A R C T G ( X ) '. STZ ATGSDX < X ARGUMENT POSITIF OU NUL A PRIORI. BSR AFCAZ JGE ARCTG1 DC ATGSDX < X ARGUMENT NEGATIF. ARCTG1: EQU $ BSR AFABS < U = ABS(X). FCAM ATGUN JGE ARCTG2 < < U < 1 : J RECOIT 0. < LXI 0 JMP ARCTG3 ARCTG2: EQU $ < < U >= 1 : J RECOIT 2 ET U RECOIT 1/U. < LXI 2 < J = 2. FST ATGT1 FLD ATGUN FDV ATGT1 < U = 1/U. ARCTG3: EQU $ FCAM ATGPSC < COMPARER U A TG(PI/12). JG ARCTG4 < < U <= TG(PI/12) : J RECOIT J+2. < ADRI 2,X < J = J + 2. JMP ARCTG5 ARCTG4: EQU $ < < U > TG(PI/12) : J RECOIT J+1 ET < U RECOIT (U * RACINE(3) - 1) / (RACINE(3) + U). < ADRI 1,X < J = J + 1. FST ATGT1 FMP ATGR3 FSB ATGUN PSR A,B FLD ATGR3 FAD ATGT1 FST ATGT1 PLR A,B FDV ATGT1 < U=(U*RACINE(3)-1)/(RACINE(3)+U). ARCTG5: EQU $ < < FORMER Y = U * P(U ** 2) LES COEFFICIENTS DU POLYNOME ETANT ATGP1, ATGP2 < ATGP3 ET ATGP4. ON CALCULE : < Y = U * (P1 - P2 * U ** 2 + (P3 / (P4 + U ** 2)). < FST ATGT1 < TRAV1 = U. FMP ATGT1 FST ATGT3 < TRAV3 = U ** 2. FAD ATGP4 FST ATGT2 FLD ATGP3 FDV ATGT2 FAD ATGP1 PSR A,B FLD ATGP2 FMP ATGT3 FST ATGT3 PLR A,B FSB ATGT3 < Y = P(U ** 2). FMP ATGT1 < Y = U * P( U ** 2). FST ATGT1 < TRAV1 = U * P (U ** 2). < < BRANCHEMENT SELON VALEUR DE J (REGISTRE 'X'). < ADRI -2,X CPZR X JE ARCTG6 JL ARCTG7 ADRI -1,X CPZR X JE ARCTG8 < < FAIRE Y = PI / 2 - Y. < FLD ATGPS2 JMP ARCTG9 ARCTG8: EQU $ < < FAIRE Y = PI / 3 - Y. < FLD ATGPS3 ARCTG9: EQU $ FSB ATGT1 < - Y. JMP ARCTG6 ARCTG7: EQU $ < < FAIRE Y = PI / 6 + Y. < FAD ATGPS6 ARCTG6: EQU $ < < AFFECTER A Y LE SIGNE DU X ARGUMENT. < CPZ ATGSDX < SIGNE DU X ARGUMENT. JL ARCTGA < < X ARGUMENT POSITIF OU NUL, IL FAUT QUE Y LE SOIT. < BSR AFCAZ JGE ARCTGB BSR AFNEG JMP ARCTGB ARCTGA: EQU $ < < X ARGUMENT NEGATIF, IL FAUT QUE Y LE SOIT. < BSR AFCAZ JL ARCTGB BSR AFNEG ARCTGB: EQU $ FCMZ VARU < EST-ON A DROITE OU A GAUCHE DE 'V' ??? JGE ARCTGC < A DROITE... FAD PI3141 < A GAUCHE... ARCTGC: EQU $ RSR :F :F < <<'SIOT Z**ALPHA 1' DF'SIOT ZOOM 1' ED'SIOT ZOOM 1' IN0 PAGE IDP "SIOT ZOOM 1" < < < Z O O M 1 : < < < FONCTION : < CE MODULE REALISE UN ZOOM < DE RAPPORT QUELCONQUE. < < < ARGUMENTS : A0:: VAL 0 < RAPPORT SUR OX, A1:: VAL A0+1 < RAPPORT SUR OY. < < LOCAL FLOC: EQU $ PREM: WORD 0 < INDICATEUR DE PREMIER PASSAGE. XFA0: FLOAT 0 < RAPPORT SUR OX, XFA1: FLOAT 0 < RAPPORT SUR OY. PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ CPZ PREM < EST-CE LE PREMIER PASSAGE ??? JG SPU1 < NON... IC PREM < OUI... < < ENTREE DES RAPPORTS : < LXI A0 BSR ASPCT FST XFA0 < RAPPORT SUR OX, LXI A1 BSR ASPCT FST XFA1 < RAPPORT SUR OY. < < ZOOM SUR OX : < SPU1: EQU $ FLD VARU FMP XFA0 RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < ZOOM SUR OY : < FLD VARV FMP XFA1 RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR :F :F < <<'SIOT ZOOM 1' DF'SIOT ROTATE CONF 1' ED'SIOT ROTATE CONF 1' IN0 PAGE IDP "SIOT ROTATE CONF 1" < < < R O T A T I O N C O N F O R M E 1 : < < < FONCTION : < CE MODULE PERMET D'EFFECTUER < DES ROTATIONS "CONSERVATIVES", < C'EST-A-DIRE CONFORMES : ELLES < CONSERVENT LES CERCLES ET LES < ANGLES ; ON COMMENCE PAR ENTRER < CONVERSATIONNELLEMENT LA DEFINI- < TION DE LA ROTATION PAR 3 POINTS < (A,O,B), 'O' ETANT LE CENTRE < DE LA ROTATION... < 4 COMMANDES SONT DISPONIBLES : < "A", "O" ET "B" POUR DEFINIR < LES 3 POINTS (A,O,B), ET "F" EN < FIN DE DEFINITION, QUI EST D'AILLEURS < REFUSEE SI L'UN DES 3 POINTS N'A < PAS ETE DEFINI (C'EST-A-DIRE SI < SON ABSCISSE EST NULLE...). < < < ARGUMENTS : A0:: VAL 0 < PARAMETRE DE COMPENSATION DU FORMAT < RECTANGULAIRE DE LA TELEVISION ; EN < GENERAL : A0=3/4. A1:: VAL A0+1 < PARAMETRE DE COMPENSATION DE DISTORSIONS < DE REGLAGE ; SI L'IMAGE EST UNE IMAGE < ENTREE PAR CAMERA : A1=20/19 (BASE 10), < SINON, A1=1... A2:: VAL A1+1 < =0 : EFFACER L'ECRAN AVANT, < #0 : LE LAISSER TEL QUEL... < < < L O C A L : < < LOCAL FLOC: EQU $ < < INDICATEUR DE PREMIERE FOIS : < IPREM: WORD -1 < < DONNEES D'ACCES AU CURSEUR GRAPHIQUE : < CURSOR: BYTE "N";0 < CARACTERE DE DEBLOCAGE DU < CURSEUR (ERREUR A PRIORI). DZS 2 < COORDONNEES Y ET X. 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. < < FORMAT DE L'IMAGE : < C3: WORD 3 < POUR ACCEDER A C4: WORD 4 < L'IMAGE ENTIERE... ANLIG: WORD NLIGM1 < NOMBRE DE LIGNES-1 DE L'IMAGE, NMPL: WORD CNMPL < NOMBRE DE POINTS PAR LIGNE... ARAZI: WORD 0 < POUR RAZER L'ECRAN... < < POINTS ARGUMENTS : < FXA: FLOAT 0 < X(A), FYA: FLOAT 0 < Y(A). FXO: FLOAT 0 < X(O), FYO: FLOAT 0 < Y(O). FXB: FLOAT 0 < X(B), FYB: FLOAT 0 < Y(B). FX1: FLOAT 0 < X1=XA-XO. FY1: FLOAT 0 < Y1=YA-YO. FX2: FLOAT 0 < X2=XB-XO. FY2: FLOAT 0 < Y2=YB-YO. FMODUL: FLOAT 0 < PRODUIT DU MODULE DES VECTEURS BA ET BC. < < MATRICE DE ROTATION : < FMA11: FLOAT 0 FMA12: FLOAT 0 FMA21: FLOAT 0 FMA22: FLOAT 0 FXBENT: FLOAT 0 < CENTRE DE FYBENT: FLOAT 0 < LA ROTATION. < < VARIABLES DE TRAVAIL : < FWORK4: FLOAT 0 FWORK5: FLOAT 0 FWORK6: FLOAT 0 < < ARGUMENTS : < XFA0: FLOAT 0 < 'A0'. XFA1: FLOAT 0 < 'A1'. < < RELAIS : < ACLIGN: WORD CLIGN < CLIGNOTTEMENT D'UN POINT (X,Y)... ASPU1: WORD SPU1 < RELAI... PROG < < < C O M P O S A N T E E N ' U ' : < < SPU: EQU $ CPZ IPREM < EST-CE LA PREMIERE FOIS ??? JL SPU2 < OUI, ALLONS INITIALISER... BR ASPU1 < NON, ALLONS TRANSFORMER... SPU2: EQU $ IC IPREM < MEMORISONS CETTE INITIALISATION... < < ENTREE DES PARAMETRES : < LXI A0 BSR ASPCT FST XFA0 FCAZ JE $ < A CAUSE DES DIVISIONS PAR 0... LXI A1 BSR ASPCT FST XFA1 FCAZ JE $ < A CAUSE DES DIVISIONS PAR 0... < < ENTREE DE LA DEFINITION DE LA ROTATION : < CUR1: EQU $ 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 < MISE AU DV C3 < FORMAT TELEVISION... SLRS DEDY < REDUCTION VIDEO. SB ANLIG < 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. < < ANALYSE DE LA COMMANDE, SONT RECONNUES : < < "A" : DEFINITION DU PREMIER POINT, < "O" : DEFINITION DU DEUXIEME POINT (SOMMET DE L'ANGLE), < "B" : DEFINITION DU TROISIEME POINT, < "F" : FIN DE DEFINITION. < CPI "F" JE CUR2 < FIN DE L'ENTREE DES POINTS... CPI "A" JE CUR3 < ENTREE DU 1ER POINT (A), CPI "O" JE CUR4 < ENTREE DU 2EME POINT (SOMMET O), CPI "B" JNE CUR1 < ERREUR... < < ENTREE DU 3EME POINT (B) : < CUR5: EQU $ LR X,A BSR AFLT FST FXB < X(B), LR Y,A BSR AFLT FST FYB < Y(B). JMP CUR1 < VERS LA COMMANDE SUIVANTE... < < ENTREE DU 1ER POINT (A) : < CUR3: EQU $ LR X,A BSR AFLT FST FXA < X(A), LR Y,A BSR AFLT FST FYA < Y(A). JMP CUR1 < VERS LA COMMANDE SUIVANTE... < < ENTREE DU SOMMET (O) : < CUR4: EQU $ LR X,A BSR AFLT FST FXO < X(O), LR Y,A BSR AFLT FST FYO < Y(O). JMP CUR1 < VERS LA COMMANDE SUIVANTE... < < FIN DES COMMANDES : < CUR2: EQU $ LAD CG SVC 0 < ON NE SAIT JAMAIS... FCMZ FXA JE CUR1 < ON INTERDIT LES COORDONNEES NULLES, ON < VALIDE AINSI QUE LES 3 POINTS (A,O,B) < ONT ETE INITIALISE... FCMZ FXO JE CUR1 FCMZ FXB JE CUR1 < (NOTA : INUTILE DE VALIDER 'Y'...) < < EFFACEMENT DE L'ECRAN : < LXI A2 BSR ASPCT BSR AROND JANE SPU3 < ON LE LAISSE TEL QUEL... LRM A,B,X WORD 0 < (A)=ADRESSE RELATIVE A 'MEMTV', WORD ARAZI < (B)=ADRESSE DU MOT DEC CLEAR, WORD LIMAG*NCOOL < (X)=NOMBRE DE MOTS A EFFACER... SPU4: EQU $ PSR X LXI 1 WCDA ADRI 1,A < PASSAGE AU MOT SUIVANT... PLR X JDX SPU4 SPU3: EQU $ < < CALCUL DE L'ANGLE 'TETA' : < FLD FXA < XA, FSB FXO < XA-XO, BSR ASFWOR FMP FWORK < (XA-XO)**2, FST FWORK5 FLD FYA < YA, FSB FYO < YA-YO, BSR ASFWOR FMP FWORK < (YA-YO)**2, FAD FWORK5 < (XA-XO)**2+(YA-YO)**2, BSR ARAC < RAC((XA-XO)**2+(YA-YO)**2), FST FWORK5 FLD FXB < XB, FSB FXO < XB-XO, BSR ASFWOR FMP FWORK < (XB-XO)**2, FST FWORK6 FLD FYB < YB, FSB FYO < YB-YO, BSR ASFWOR FMP FWORK < (YB-YO)**2, FAD FWORK6 < (XB-XO)**2+(YB-YO)**2, BSR ARAC < RAC((XB-XO)**2+(YB-YO)**2), FMP FWORK5 < RAC((XA-XO)**2+(YA-YO)**2)*RAC( < (XB-XO)**2+(YB-YO)**2), FST FMODUL FLD FXA < XA, FSB FXO < XA-XO, FST FX1 < X1=XA-XO, FLD FXB < XB, FSB FXO < XB-XO, FST FX2 < X2=XB-XO, FMP FX1 < (XA-XO)*(XB-XO), FST FWORK4 FLD FYA < YA, FSB FYO < YA-YO, FST FY1 < Y1=YA-YO, FLD FYB < YB, FSB FYO < YB-YO, FST FY2 < Y2=YB-YO, FMP FY1 < (YA-YO)*(YB-YO), FAD FWORK4 < (XA-XO)*(XB-XO)+(YA-YO)*(YB-YO), FDV FMODUL < DONNE COS(TETA)... < < CALCUL DE LA MATRICE DE ROTATION < CONSERVANT LES CERCLES ET LES < ANGLES, SOIT : < < COS(TETA) A0*A1*SIN(TETA) < -SIN(TETA)/A0/A1 COS(TETA) < FST FMA11 < ELEMENT A11 DE LA MATRICE, FST FMA22 < ELEMENT A22 DE LA MATRICE... FLD FX1 < X1, FMP FY2 < X1*Y2, BSR ASFWOR FLD FX2 < X2, FMP FY1 < X2*Y1, FSB FWORK < X2*Y1-X1*Y2, FDV FMODUL < ET PAR DIVISION PAR LE PRODUIT DES < MODULES, ON TROUVE SIN(TETA)... BSR ASFWOR FMP XFA0 < A0*SIN(TETA), FMP XFA1 < A1*A0*SIN(TETA), FST FMA12 < ELEMENT A12 DE LA MATRICE... FLD FWORK < SIN(TETA), FDV XFA0 < SIN(TETA)/A0, FDV XFA1 < SIN(TETA)/A0/A1, BSR AFNEG FST FMA21 < ELEMENT A21 DE LA MATRICE... < < TRANSFORMATION : < SPU1: EQU $ < < CALCUL DU CENTRE DE LA ROTATION : < LA TRX BSR AFLT FSB FXO BSR AFNEG FMP KFU FMP KUX FST FXBENT < X(CENTRE)=KUX*KFU*X(O). LA TRY BSR AFLT FSB FYO BSR AFNEG FMP KFV FMP KVX FST FYBENT < Y(CENTRE)=KVX*KFV*Y(O). < < ROTATION "CONSERVATIVE" : < FLD VARU < U, FSB FXBENT < U-X(CENTRE), FMP FMA11 < A11*(U-X(CENTRE)), BSR ASFWOR FLD VARV < V, FSB FYBENT < V-Y(CENTRE), FMP FMA12 < A12*(V-Y(CENTRE)), BSR APWORK < A11*(U-X(CENTRE))+A12*(V-Y(CENTRE)). FAD FXBENT < ET TRANSLATION... RSR < < < C O M P O S A N T E E N ' V ' : < < SPV: EQU $ < < CALCUL DU CENTRE DE LA ROTATION : < LA TRX BSR AFLT FSB FXO BSR AFNEG FMP KFU FMP KUY FST FXBENT < X(CENTRE)=KUY*KFU*X(O). LA TRY BSR AFLT FSB FYO BSR AFNEG FMP KFV FMP KVY FST FYBENT < Y(CENTRE)=KVY*KFV*Y(O). < < ROTATION "CONSERVATIVE" : < FLD VARU < U, FSB FXBENT < U-X(CENTRE), FMP FMA21 < A21*(U-X(CENTRE)), BSR ASFWOR FLD VARV < V, FSB FYBENT < V-Y(CENTRE), FMP FMA22 < A22*(V-Y(CENTRE)), BSR APWORK < A21*(U-X(CENTRE))+A22*(V-Y(CENTRE)). FAD FYBENT < ET TRANSLATION... RSR < < < C O M P O S A N T E E N ' W ' : < < SPW: EQU $ FLD F0 RSR < < < 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 :F :F < <<'SIOT ROTATE CONF 1'