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