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