NMPROC: VAL "KP" < NOM DU PROCESSEUR.
IDP "KP - RELEASE 29/10/1980"
EOT #SIP DEFINITION CMS5#
EOT #SIP DEF PROCESSEUR#
PROG
WORD IMAGE < ENTRY POINT DU GENERATEUR.
WORD 0
PIMAGE: EQU $ < P='12 !!!
LRP L
BR -2,L < ENTREE DANS LE PROCESSEUR KO.
EOT #SIP DEFINITION ITEM#
ITEM1: EQU ZERO+PILE-LTNI
ITEM2: EQU ZERO+PILE-LTNI-LTNI
PAGE
<
<
< I M A G E S G R A P H I Q U E E T V I D E O :
<
SIZE: VAL '528 < TAILLE PRESUMEE DU PROGRAMME.
<
< PILE DU PROGRAMME :
<
SSTACK: VAL 16
STACK: DZS SSTACK
EOT #SIP IMAGE 256#
NOM: EQU ZERO+PILE+5-LNOM-2 < NOM DE L'IMAGE VIDEO.
IMAG: EQU NOM+LNOM+2 < IMAGE VIDEO.
<
< 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
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR: EQU STACK+SSTACK
DZS 128 < CELA PEUT TOUJOURS SERVIR !!!
PAGE
<
<
< L O C A L :
<
<
LOCAL
LOC: EQU $
<
< MESSAGES :
<
M1: BYTE 15;'6D
ASCI "ERREUR DEPART!"
M2: BYTE 11;'6D
ASCI "NON FERME!"
M3: BYTE 13;'6D
ASCI "POINT ISOLE!"
M4: BYTE 10;'6D
ASCI "INTERIEUR "
M5: BYTE 10;'6D
ASCI "EXTERIEUR "
M6: BYTE 3;'6D
ASCI "X="
M7: BYTE 3;'6D
ASCI "Y="
M8: BYTE 9;'6D
ASCI "REMPLIR?"
M9: BYTE 5;'6D
ASCI "ZDC?"
NOMSEG: WORD 0 < 0=INVALIDE,
< -1=VALIDE.
SEG: DZS 4
LONSEG: VAL $-NOMSEG*2
SEGORG: EQU SEG+0
SEGEXT: EQU SEG+2
CURSOR: BYTE "N";0 < CARACTERE DE DEBLOCAGE DU
< CURSEUR (ERREUR A PRIORI).
DZS 2 < COORDONNEES Y ET X.
REP: DZS 2 < ENTREE DE NBRES HEXADECIMAUX.
<
< DEMANDES A CMS4 :
<
DEMSGN: WORD '0602 < CHARGEMENT DES OVERLAYS.
WORD BRANCH-ZERO*2
WORD ZERO-BRANCH+PILE-LTNI-LTNI*2
WORD -1
DEMCCI: WORD '0001 < APPEL DU CCI INTERACTIF.
DEMMEM: WORD '0004 < DEMANDE D'ALOCATION 12 K MOTS.
RELMEM: WORD '0004 < DEMANDE D'ALLOCATION 4K MOTS.
WORD '6000
WORD '2000
DEMOUT: WORD '0202 < ECRITURE DES MESSAGES.
WORD 0
WORD 0
DEMIN: WORD '0101 < ENTREE SUR '01.
WORD REP-ZERO*2
WORD 4
DEMREP: WORD '0101 < LECTURE 1 CARACTERE REPONSE.
WORD REP-ZERO*2
WORD 1
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.
RDK: WORD '0C00 < LECTURE SCRATCH DU DISQUE.
WORD SECTOR-ZERO*2
WORD 128*2
WORD 0 < NUMERO DU SECTEUR.
WDK: WORD '0C02 < ECRITURE SCRATCH DU DISQUE.
WORD SECTOR-ZERO*2
WORD 128*2
WORD 0 < NUMERO DU SECTEUR.
STOGS: WORD '000A < EMISSION SEGMENT COURANT.
WORD NOMSEG-ZERO*2
WORD LONSEG
WORD 'FFC0 < VALIDATION DE LA ZDC.
GETGS: WORD '0008 < ACCES NOMSEG COURANT.
WORD NOMSEG-ZERO*2
WORD SEG-NOMSEG*2
WORD 'C000
STABIL: WORD '8A01 < DEMANDE DE STABILISATION VIDEO.
WORD IMAG-ZERO*2
WORD LIMAG*2
WORD TVPV < SUR LE PROCESSEUR VERT.
<
< CONSTANTES :
<
NOM1: WORD "-+" < NOM DE L'IMAGE DE TRAVAIL,
< DANS LAQUELLE ON GENERE
< L'IMAGE FINALE.
< SUIVIS DE L'IDESC).
KIN: WORD -1 < COMPTEUR DES ENTRIES DANS KO.
NGE: WORD "GE" < NOM DU PROCESSEUR GE.
IGRAPH: WORD 1 < 0=EMISSION GRAPHIQUE,
< 1=PAS D'EMISSION GRAPHIQUE.
NMOTS: WORD 2*LTNI < NBRE DE MOTS DE ITEM1+ITEM2.
ALIMAG: WORD LIMAG < NBRE DE MOTS DE L'IMAGE.
NMPL: WORD CNMPL < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIG: 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.
KAROT: WORD 0 < COMPTEUR DES RETOURS A 'PTC'.
MULTI: WORD 0 < DETECTEUR DE MARQUAGE BOUCLE DU
< TYPE A --> B --> A --> B...
SDEP: WORD 0;0 < POINT DE DEPART POUR LE TOUR
< SUIVANT (FUTUR 'DEP').
VX: WORD 1 < COORDONNEES X ET Y DU
VY: WORD 0 < VECTEUR DEPLACEMENT.
SVX: WORD 0 < SAVE VX.
SVY: WORD 0 < SAVE VY.
TEMPO: WORD 5*2 < NOMBRE DE CLIGNOTEMENTS VIDEO.
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.
KVOISH: WORD 0 < COMPTAGE DES VOISINS DE DESSUS.
KVOISB: WORD 0 < COMPTAGE DES VOISINS DE DESSOUS.
LASTY: WORD -1 < Y DU DERNIER POINT TRACE PAR 'SETV',
< N'EXISTE PAS INITIALEMENT...
<
< RELAIS DIVERS :
<
ANOM1: WORD NOM+0 < POUR METTRE LE NOM I1/I2,
ANOM2: WORD NOM+1 < POUR METTRE L'IDESC/EOT.
ASECT: WORD SECTOR-1,X < RELAI DE RAZ BUFFER SECTEUR.
AIMAG1: WORD IMAG,X < ACCES A L'IMAGE VIDEO COURANTE.
AIMAG2: WORD IMAG+LIMAG,X < ACCES A LA MEMOIRE DES (Y+LASTY)/2.
AIMAG0: WORD 0 < POUR METTRE LES SECTEURS
< SCRATCH DANS L'IMAGE COURANTE.
ASECT1: WORD SECTOR,X < ACCES AU SECTEUR COURANT.
AIMAG: WORD IMAG-1,X < RELAI DE RAZ IMAGE COURANTE.
AREP: WORD REP,X < RELAI D'ACCES AUX REPONSES.
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.
ASETW: WORD SETW < MARQUAGE DES POINTS (X,(Y+LASTY)/2).
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.
AOVL: WORD OVL < CHARGEMENT DES OVERLAYS.
AEXIST: WORD EXIST < EXISTENCE D'UN POINT.
AVOISV: WORD VOISV < TEST DES POINTS (X,(Y+LASTY)/2).
AVOISI: WORD VOISI < TEST ET COMPTAGE D'UN VOISIN.
AVOISY: WORD VOISY < IDEM...
AMASK: WORD MASK < TEST DES CONFIGURATIONS DANGEREUSES.
APILE: WORD PILE-1 < PILE DE SMC.
ASTACK: WORD STACK-1 < PILE DE KO.
AI2: WORD ITEM2-1,X < RELAI DE RAZ ITEM1+ITEM2.
ASEND: WORD SEND < EMISSION SEGMENT COURANT
< ET ATTENTE D'ACQUITTEMENT.
ASENDO: WORD SENDO < INSERTION POINT DE DEPART.
AGOGE: WORD GOGE < RETOUR A GE.
APRINT: WORD PRINT < EDITION DES MESSAGES.
AHEX: WORD HEX < CONVERSION ASCI --> BINAIRE.
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.
ACONTI: WORD CONTI < RETOUR DE LA ZONE SCRATCH
< EN MEMOIRE.
ARAZDK: WORD RAZDK < RAZ DE LA ZONE SCRATCH DK.
ALOOP: WORD CONT1 < VERS LE CHANGEMENT DE 'PTC'.
ASP1: WORD SP1 < COMPTAGE DES VOISINS DESSUS/DESSOUS.
ASP2: WORD SP2 < DISCRIMINATION TANGENCE/INFLEXION.
ADEP4: WORD DEP4 < ERREUR DE POINT DE DEPART...
<
< TOPOGRAPHIE MEMOIRE :
<
NSEC: VAL LIMAG/128 < NRE DE SECTEURS POUR UNE IMAGE.
XSECR: VAL 2*LTNI-128
NSECR: VAL XSECR/128
< NBRE DE SECTEURS RESIDANTS.
ALS: WORD LSECT-1,X < RELAI D'INITIALISATION DE
< LA LISTE LSECT.
ALSECT: WORD LSECT,X < REALI D'ACCES A LSECT.
ATOPO: WORD TOPO-1,X < RELAI D'ACCES A TOPO.
ASECTC: WORD 0 < RELAI COURANT D'ACCES A UN
< SECTEUR MANIPULE.
AUSE: WORD USE-1,X < RELAI D'ACCES A USE.
INFINI: WORD '7FFF
CSECT: WORD 0 < MEMORISE LE SECTEUR COURANT.
WDKT: WORD '0C02 < ECRITURE 1 SECTEUR TOPO.
WORD 0
WORD 128*2
WORD 0
RDKT: WORD '0C00 < LECTURE 1 SECTEUR TOPO.
WORD 0
WORD 128*2
WORD 0
ABUF1: WORD PILE-XSECR/128*128*2
< @OCTET DU 1ER BUFFER LIBRE.
AWSE: WORD WSE < ROUTINE DE REECRITURE
< D'UN SECTEUR TOPO.
AVIRE: WORD VIRE < ROUTINE SUPPRIMANT LA TOPO.
ARESID: WORD RESID < REND LE SECTEUR SCRATCH (B)
< RESIDENT EN MEMOIRE.
<
< LISTE DES SECTEURS REELS (DE 0 A NSEC-1) :
<
LSECT: EQU $
DO NSEC
WORD -1 < INITIALEMENT NON RESIDENT.
<
< LISTE D'OCCUPATION DES BUFFERS (DE 1 A NSECR) :
<
TOPO: EQU $
DO NSECR
WORD -1 < INOCCUPE INITIALEMENT.
<
< COMPTEUR D'USAGE DES BUFFERS :
<
USE: EQU $
DO NSECR
WORD 0 < INUTILISE INITIALEMENT.
PAGE
PROG
<
<
< E D I T I O N D ' U N M E S S A G E :
<
<
< ARGUMENT :
< A=@MESSAGE.
<
<
PRINT: EQU $
PSR C,X
LR A,C < C=@MESSAGE.
ADR A,A
ADRI 1,A < A=@OCTET DU MESSAGE.
STA DEMOUT+1
LBY 0,C < A=LONGUEUR DU MESSAGE.
STA DEMOUT+2
LAD DEMOUT
SVC 0 < EDITION DU MESSAGE.
PLR C,X
RSR
PAGE
<
<
< E M I S S I O N S E G M E N T C O U R A N T :
<
<
< FONCTION :
< CETTE ROUTINE EMET, SI CELA A ETE
< DEMANDE PAR L'UTILISATEUR LE SEGMENT
< COURANT A L'AIDE DE LA ZDC, ET ATTEND
< L'ACCUSE DE RECEPTION...
<
<
< ARGUMENT :
< X,Y=COORDONNEES DU POINT COURANT (SEGEXT).
<
<
SEND: EQU $
CPZ IGRAPH < GRAPHIQUE DEMANDE ???
JNE SEND1 < NON, RIEN A FAIRE.
<
< GENERATION DE LA NOUVELLE SEGEXT :
<
LA SEGEXT+X
STA SEGORG+X
LA SEGEXT+Y
STA SEGORG+Y
LR Y,A < Y COURANT,
SB NLIG < LES AXES GRAPHIQUES ET
NGR A,A < VIDEOS SONT INVERSES.
SLLS DEDY
STA SEGEXT+Y
LR X,A < X COURANT,
SLLS DEDX < ET CADRAGE.
STA SEGEXT+X
PSR X < A CAUSE DES SVC A SUIVRE.
<
< EMISSION DU SEGMENT COURANT :
<
SEND2: EQU $
LAD GETGS
SVC 0 < ACCES A LA VALIDATION COURANTE.
CPZ NOMSEG
JNE SEND2 < SEGMENT PRECEDENT NON ENCORE
< ACQUITTE, ON ATTEND !!!
DC NOMSEG < OK, NOMSEG=-1.
LAD STOGS
SVC 0 < EMISSION SEGMENT COURANT.
PLR X < RESTAURE X.
SEND1: EQU $
RSR
<
<
< I N S E R T I O N P O I N T D E D E P A R T :
<
<
SENDO: EQU $
CPZ IGRAPH < GRAPHIQUE DEMANDE ???
JNE SENDO1 < NON...
LR Y,A < OUI, CONVERSION VIDEO
SB NLIG < GRAPHIQUE DES COORDONNEES
NGR A,A < DU POINT DE DEPART (X,Y).
SLLS DEDY
STA SEGEXT+Y
LR X,A
SLLS DEDX
STA SEGEXT+X
SENDO1: EQU $
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
<
<
< 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 $
BSR ASEND < EMISSION POSSIBLE DU
< SEGMENT COURANT.
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,A
SLRD 7 < A=NUMERO DU SECTEUR LE CONTENANT.
XR A,B < B=NUMERO DU SECTEUR.
SLRS 9 < A=NUMERO DU MOT DANS LE SECTEUR.
LR A,Y < Y=NUMERO DU MOT DANS LE SECTEUR.
BSR ARESID < REND LE SECTEUR (B) RESIDENT.
XR X,Y < X=NUMERO MOT, Y=NUMERO BIT.
LA &ASECTC < ACCES MOT.
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 &ASECTC < MAJ IMAGE VIRTUELLE.
VIRT3: EQU $
PLR B,X,Y
RSR
<
<
< R E S I D E N C E D ' U N S E C T E U R :
<
<
< ARGUMENT :
< B=NUMERO DU SECTEUR A RENDRE RESIDENT.
<
<
RESID: EQU $
PSR X,Y
LR B,X < X=SECTEUR REFERENCE.
LA &ALSECT
JAG VIRT1 < LE SECTEUR REFERENCE EST DEJA
< RESIDENT A L'ADRESSE=(A).
<
< CAS OU LE SECTEUR REFERENCE (X) N'EST PAS RESIDENT :
<
STX CSECT < SAUVEGARDE DE (X).
LXI NSECR
LA INFINI < RECHERCHE D'UN BUFFER.
VIRT2: EQU $
CPZ &ATOPO < LE BUFFER COURANT EST-IL
< LIBRE ???
JGE VIRT4 < OUI, PAR LE SECTEUR (A).
LR X,Y < NON, (Y)=BUFFER CHOISI.
JMP VIRT5
VIRT4: EQU $
CP &AUSE < EST-IL PEU UTILISE ???
JL VIRT6 < NON, ON LE LAISSE...
LA &AUSE < NON, IL DEVIENT LE MINI.
LR X,Y < PEUT-ETRE SERA-T'IL ELU..
VIRT6: EQU $
JDX VIRT2
<
< OK, ON A TROUVE UN BUFFER (Y)PEU OU PAS UTILISE :
<
VIRT5: EQU $
LR Y,X < X=NUMERO DE BUFFER/1.
BSR AWSE < REECRITURE DU SECTEUR TOPO
< ASSOCIE PAR 'TOPO' AU
< BUFFER (X).
LX CSECT < X=SECTEUR A CHARGER.
LA WDKT+1 < A=@OCTET DU BUFFER LIBERE.
STA RDKT+1 < C'EST LA QU'ON VA LIRE (X).
SLRS 1 < A=@MOT DU BUFFER.
STA &ALSECT < LE SECTEUR (X) SERA RESIDENT
< A L'ADRESSE (A).
STX RDKT+3
XR X,Y < Y=SECTEUR A CHARGER,
< X=NUMERO DU BUFFER.
STY &ATOPO < ON MEMORISE LE NUMERO
< DU SECTEUR (Y) ASSOCIE
< AU BUFFER (X).
XR X,Y < X=SECTEUR A CHARGER,
< Y=NUMERO DU BUFFER.
LAD RDKT
SVC 0 < CHARGEMENT DU SECTEUR.
LX CSECT
LA &ALSECT < A=@MOT DU BUFFER.
VIRT1: EQU $
SBT 0 < BIT D'INDEX.
STA ASECTC < GENERATION D'UN RELAI D'ACCES
< TEMPORAIRE AU SECTEUR (X).
SLLS 1 < CONVERSION EN UNE ADRESSE
< D'OCTET.
SB ABUF1
SLRS 8
ADRI 1,A < A=NUMERO DU BUFFER LE CONTENANT.
LR A,X
IC &AUSE < COMPTAGE DES UTILISATIONS.
PLR X,Y
RSR
<
<
< R E E C R I T U R E D ' U N B U F F E R :
<
<
< ARGUMENT :
< X=NUMERO DE CE BUFFER.
<
<
WSE: EQU $
LR X,A
ADRI -1,A
SLLS 8
AD ABUF1
STA WDKT+1 < @OCTET DU BUFFER.
LA &ATOPO < A=SECTEUR ASSOCIE.
JAL WSE1 < IL N'EXISTE PAS...
PSR X
STA WDKT+3 < SI EXISTE MAJ DE WDKT.
LAD WDKT
SVC 0 < REECRITURE DU SECTEUR.
LX WDKT+3 < X=SECTEUR ASSOCIE.
LAI -1
STA &ALSECT < LE SECTEUR ASSOCIE N'EST
< PLUS RESIDENT.
PLR X < RESTAURE : X=NUMERO BUFFER.
STA &ATOPO < LE BUFFER EST LIBRE.
STZ &AUSE < ET NON UTILISE...
WSE1: EQU $
RSR
<
<
< R E E C R I T U R E D E T O U S L E S
< B U F F E R S E N S C R A T C H :
<
<
VIRE: EQU $
PSR X
LXI NSECR < X=NBRE DE BUFFERS.
VIRE1: EQU $
BSR AWSE < ECRITURE DU BUFFER (X).
JDX VIRE1
PLR X
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 $
STZ RDK+3 < DEPART SUR LE SECTEUR 0.
LA AIMAG1
RBT 0
STA AIMAG0 < INITIALISATION SUR @IMAG.
LXI LIMAG/128 < X=NBRE DE SECTEURS.
ECH1: EQU $
PSR X
LB RDK+3 < B=NUMERO DU SECTEUR COURANT.
BSR ARESID < QUE L'ON REND RESIDENT.
LX RDK+3
LA &ALSECT < A=@BUFFER QUI LE CONTIENT.
JAG ECH2 < OK, IL EST OCCUPE...
WORD '1E16 < E R R E U R P R O G !!!
ECH2: EQU $
LXI 128 < X=NBRE DE MOTS/SECTEUR.
LB AIMAG0 < B=@RECEPTEUR=@IMAGE.
MOVE < GENERATION IMAGE.
LXI 128 < X=NBRE DE MOTS/SECTEUR.
ADR X,B < PROGRESSION @IMAGE.
STB AIMAG0
IC RDK+3 < PASSAGE AU SECTEUR SUIVANT.
PLR X
JDX ECH1
RSR
<
<
< R A Z D E L A Z O N E S C R A T C H :
<
<
RAZDK: EQU $
STZ WDK+3 < DEPART SUR LE SECTEUR 0.
LXI 128
RAZ1: EQU $
STZ &ASECT < RAZ DU BUFFER SECTOR.
JDX RAZ1
LXI LIMAG/128 < NBRE DE BUFFERS SCRATCH
< NECESSAIRE POUR 1 IMAGE.
RAZ2: EQU $
PSR X < SAVE LE DECOMPTEUR.
LB WDK+3 < B=NUMERO DU SECTEUR COURANT.
BSR ARESID < QUE L'ON REND RESIDENT.
LX WDK+3
LB &ALSECT < B=RECEPTEUR=@BUFFER ASSOCIE.
CPZR B < VALIDATION...
JG RAZ3 < OK, IL EST OCCUPE..
WORD '1E16 < E R R E U R P R O G !!
RAZ3: EQU $
LA ASECT1
RBT 0 < A=@EMETTEUR DES '0000.
LXI 128 < X=NBRE DE MOTS A RAZER.
MOVE < RAZ DU SECTEUR COURANT.
PLR X < RESTAURE LE DECOMPTEUR.
IC WDK+3 < PASSGE AU SECTEUR SUIVANT.
JDX RAZ2 < DECOMPTAGE..
RSR
PAGE
<
<
< M I S E D ' U N B I T A 1 :
<
<
< ARGUMENTS :
< X ET Y CONTIENNENT X ET Y DU POINT.
< C=@IMAG (IMAGE VIDEO).
<
<
SET: EQU $
PSR B,X,C
LR Y,A
MP NMPL < CONVERSION DE L'Y DU POINT EN
< UN NUMERO DE MOT.
ADR B,C
LR X,A
SLRS 4
ADR A,C < C=@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,C < A=MOT CONTENANT LE POINT (X,Y).
SBT 0,X < POSITIONNEMENT DU POINT.
STA 0,C < MISE A JOUR DE CE MOT.
PLR B,X,C
RSR
<
<
< M A R Q U A G E D E S L A S T Y :
<
<
< ARGUMENTS : CF 'SET'.
<
<
SETW: EQU $
PSR Y,C
LA ALIMAG
ADR A,C < PASSAGE SUR LA MEMOIRE DES 'LASTY'...
LA LASTY
JAL SETW1 < CAS DE LA PREMIERE FOIS...
CPR A,Y
JE SETW1 < ON NE MARQUE PAS SI Y=LSTY...
JG SETW2 < Y>LASTY...
LR A,Y < SI Y<LASTY, Y <-- (LASTY)...
SETW2: EQU $
BSR AINVER < MARQUAGE DE (X,Y) SI Y#LASTY...
< ON MARQUE PAR INVERSION, AFIN D'ELIMINER
< LES RETOURS ARRIERE SUR SES PROPRES PAS..
SETW1: EQU $
PLR Y,C
STY LASTY < CHANHGEMENT DE LASTY.
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.
< C=@IMAG (IMAGE VIDEO).
<
<
RESET: EQU $
PSR B,X,C
LR Y,A
MP NMPL
ADR B,C
LR X,A
SLRS 4
ADR A,C < C=@MOT CONTENANT LE POINT (X,Y).
LAI 'F
ANDR A,X < X=NUMERO DU BIT REPRESENTANT
< LE POINT DANS LE MOT ((C)).
LA 0,C < A=MOT CONTENANT LE POINT (X,Y).
RBT 0,X < EFFACEMENT DU POINT.
STA 0,C < MISE A JOUR DE CE MOT.
PLR B,X,C
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.
< C=@IMAG (IMAGE VIDEO).
<
<
INVER: EQU $
PSR B,X,C
LR Y,A
MP NMPL
ADR B,C
LR X,A
SLRS 4
ADR A,C < C=@MOT CONTENANT LE POINT (X,Y).
LAI 'F
ANDR A,X < X=NUMERO DU BIT REPRESENTANT
< LE POINT DANS LE MOT ((C)).
LA 0,C < A=MOT CONTENANT LE POINT (X,Y).
IBT 0,X < INVERSION VIDEO DU POINT.
STA 0,C < MISE A JOUR DE CE MOT.
PLR B,X,C
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
LB TEMPO < B=NBRE DE CLIGNOTEMENTS.
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 ,
< C=@IMAG.
<
<
< RESULTAT :
< CARY POISITIONNE PAR LE POINT (0/1) 9
<
<
TEST: EQU $
PSR B,X,C
LR Y,A < A=COORDONNEE Y DU POINT.
MP NMPL
ADR B,C
LR X,A < A=COORDONNEE X DU POINT.
SLRS 4
ADR A,C < C#MOT CONTENANT LE POINT (X,Y).
LAI 'F
ANDR A,X < X=NUMERO DU POINT DANS LE MOT (C)
LA 0,C
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,C
RSR
PAGE
<
<
< C O M P T A G E D E S V O I S I N S
< D E S S U S / D E S S O U S :
<
<
SP1: EQU $
BSR AVOISV < VOISIN DE DESSUS M(X,Y-1).
JANE SP11 < IL EST NOIR... IL NE COMPTE PAS ?!?!
IC KVOISH < IL N'Y A QUE LES BLANCS QUI COMPTENT !!!
SP11: EQU $
ADRI 1,Y
BSR AVOISV < VOISIN DE DESSOUS M(X,Y+1).
JANE SP12 < NOIR...
IC KVOISB < BLANC...
SP12: EQU $
ADRI -1,Y
RSR
<
<
< D I S C R I M I N A T I O N
< T A N G E N C E / I N F L E X I O N :
<
<
< RESULTAT :
< A=0 TANGENCE HORIZONTALE,
< =1 INFLEXION.
<
<
SP2: EQU $
LA KVOISH
CPI 1
JE SP21 < INFLEXION : A=KVOISH=1.
LA KVOISB
CPI 1
JE SP21 < INFLEXION : A=KVOISB=1.
LA KVOISH
CP KVOISB
JNE SP22 < TANGENCE...
TBT 15
JNC SP22 < TANGENCE...
LAI 1 < KVOISH=KVOISB IMPAIRS : INFLEXION...
JMP SP21
SP22: EQU $
LAI 0 < TANGENCE HORIZONTALE : AUTRES CAS (A=0).
SP21: EQU $
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.
< A DONNE POUR 'VOISY' LE RANG+1 D'UN
< BIT A METTRE A 1 DANS B...
<
<
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.
VOISI1: EQU $
RSR
<
< ENTRY AVEC COMPTAGE UNIQUEMENT :
<
VOISY: EQU $
ADRI -1,A
PSR A
BSR AEXIST < TEST DU POINT (X,Y)...
CPI 0 < A CAUSE DU PLR...
PLR A
JNE VOISI1 < N'EXISTE PAS OU EST A 0...
XR A,X
SBT 16,X < MEMORISATION DANS B...
XR A,X
JMP VOISI1
<
<
< 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 NLIG
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 D E ( X , L A S T Y ) :
<
<
VOISV: EQU $
PSR C
LA ALIMAG
ADR A,C
BSR AEXIST < EXISTENCE SUR LA MEMOIRE DES LASTY...
PLR C
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 NLIG
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 APRINT < ENVOI DU MESSAGE ARGUMENT.
LAD DEMIN
SVC 0 < ENTREE D'UN NBRE HEXADECIMAL.
LYI 4 < 4 CHIFFRES MAX A CONVERTIR.
BSR AHEX < ESSAI DE CONVERSION...
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.
<
<
< C O N V E R S I O N A S C I --> B I N A I R E :
<
<
< RESULTAT :
< A=VALEUR CONVERTIE S'IL N'Y A PAS
< D'ERREUR, LES CODES DE CONDITION
< L'INDIQUANT.
<
<
HEX: EQU $
PSR B,X
LXI 0 < X=INDEX DE 'REP'.
LBI 0 < B=CUMUL COURANT.
HEX1: EQU $
LBY &AREP < A=CARACTERE COURANT DE 'REP'.
CPI '04 < EST-CE 'EOT' ???
JE HEX5 < OUI, FIN DE CONVERSION.
CPI '0D < EST-CE 'R/C' ???
JE HEX5 < OUI, FIN DE CONVERSION.
ADRI -'30,A < CONVERSION BIANIRE.
JAL HEX2 < ERREUR.
CPI 9 < EST-CE UN CHIFFRE DECIMAL ???
JLE HEX3 < OUI.
ADRI -"A"+"9"+1,A < NON.
CPI 'A < VALIDATION HEXDECIMALE ???
JL HEX2 < ERREUR.
CPI 'F < VALIDATION HEXADECIMALE ???
JG HEX2 < ERREUR.
HEX3: EQU $
SCRS 4 < CUMUL PARTIEL DE LA
SCLD 4 < VALEUR A CONVERTIR.
ADRI 1,X < PASSAGE AU CARACTERE SUIVANT.
CPR X,Y < EST-CE FINI ???
JNE HEX1 < NON.
HEX5: EQU $
LR B,A < OUI, A=RESULTAT.
LBI 0 < B=0 : OK.
HEX4: EQU $
CPZR B < POSITIONNEMENT DES CODES
< DE CONDITION SUR ERREUR.
PLR B,X
RSR
HEX2: EQU $ < CAS DES ERREURS.
LBI 1 < B=1#0 : ERREUR.
JMP HEX4 < VERS LA SORTIE...
PAGE
<
<
< R E T O U R A ' G E ' :
<
<
GOGE: EQU $
STZ SEGEXT+X
STZ SEGEXT+Y
LXI 0
LY NLIG
BSR ASEND < EMISSION POSSIBLE D'UN SEGMENT
< REDUIT A UN POINT DOUBLE
< ORIGINE GRAPHIQUE.
GOGEX: EQU $ < ENTRY ALT-MODE.
LAD CG
SVC 0 < ON NE SAIT JAMAIS...
BSR AVIRE < TOUTE L'IMAGE VIRTUELLE EST
< RENVOYEE EN SCRATCH AVANT
< LE RETOUR A 'GE'.
<
< RAZ DES ITEMS 1 ET 2 :
<
LX NMOTS < X=NBRE DE MOTS A RAZER.
GOGE1: EQU $
STZ &AI2
JDX GOGE1
<
< MISE EN PLACE DU NOM DE 'GE' :
<
LA NGE
STA 0,W < (W)=@BRANCH.
<
< RETOUR A 4K, ET SMC :
<
LA APILE
LR A,K
LAD RELMEM
SVC 0
GOGE2: EQU $
LAD DEMSGN < A=@DEMSGN.
BSR AOVL < CHARGEMENT DE 'GE'.
LAD DEMCCI
SVC 0 < RETOUR AU CCI SI ERREUR.
JMP GOGE2
PAGE
<
<
< R E M P L I S S A G E D ' U N C O N T O U R :
<
<
WORD IMAG < VALEUR BASE C.
WORD LOC+'80 < VALEUR BASE L.
WORD BRANCH < VALEUR BASE W.
IMAGE: EQU $
LRP K
ADRI -1,K
PLR C,L,W < INITIALISATION C,L,W.
LA ASTACK
LR A,K < INITIALISATION K.
IC KIN < COMPTAGE DES ENTRIES.
JG GOGEX < ABORT SI ALT-MODE.
LAD DEMMEM
SVC 0
WORD '1E45 < RENVOIE : A=IDESC.
ADRI '30,A < CONVERSION ASCI.
SWBR A,A
ORI '04 < QUE L'ON FAIT SUIVRE DE EOT.
STA &ANOM2 < ET QUE L'ON MET DERRIERE I1/I2.
LA NOM1
STA &ANOM1 < FIN DE GENERATION DU NOM
< DE L'IMAGE DE TRAVAIL.
<
< EMISSION GRAPHIQUE ???
<
GR1: EQU $
LAD M9
BSR APRINT < ENVOI MESSAGE.
LAD DEMREP
SVC 0 < LECTURE DE LA REPONSE.
LBY REP
<
< REPONSES RECONNUES :
< O : EMISSION GRAPHIQUE,
< N : PAS D'EMISSION GRAPHIQUE.
<
CPI "N"
JE GR2 < IGRAPH=1 : PAS D'EMISSION.
CPI "O"
JNE GR1 < ERREUR, ON RECOMMENCE.
STZ IGRAPH < IGRAPH=0 : EMISSION.
GR2: EQU $
<
< 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 NLIG
JLE RAZE2
ADRI -1,Y
<
< BORDURE INFERIEURE (Y=NLIG) :
<
RAZE3: EQU $
BSR ATEST < TEST DU POINT M(X,NLIG) ???
JNC RAZE3X < NOIR...
ADRI -1,Y < BLANC :
BSR ASET < ON MET A BLANC LE POINT M(X,NLIG-1)...
ADRI 1,Y
BSR ARESET < ET ON MET A NOIR LE POINT M(X,NLIG).
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 $
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 NLIG < 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,
< N : ENTREE EN HEXA DES COORDONNEES,
< H : ENTREE PAR LE CURSEUR VERS LE HAUT,
< B : ENTREE PAR LE CURSEUR VERS LE BAS.
<
CPI "C"
JE CUR1 < CLIGNOTEMENT SEUL...
LBI 1 < B=1 : VERS LE BAS A PRIORI...
CPI "B"
JE CUR3 < CURSEUR VERS LE BAS...
LBI -1 < B=-1 : VERS LE HAUT A PRIORI...
CPI "H"
JE CUR3 < CURSEUR VERS LE HAUT...
CPI "N"
JNE CUR1 < RIEN COMPRIS, ON RECOMMENCE.
<
< ENTREE EN HEXA DES COORDONNEES :
<
LAD M6 < A=@MESSAGE 'X='.
BSR ACOORD < ENTREE DE X.
LR A,X < X=X(CURSEUR VIDEO).
LAD M7 < A=@MESSAGE 'Y='.
BSR ACOORD < ENTREE DE Y.
LR A,Y < Y=Y(CURSEUR VIDEO).
<
< ON A UN POINT DE DEPART :
<
CUR3: EQU $
PSR B < SAVE LE SENS DE RECHERCHE DE 'DEP'.
STX DEP+X
STY DEP+Y
<
< INITIALISATION DU DISQUE :
<
BSR ARAZDK
<
< RAZ DE LA MEMOIRE DES LASTY :
<
LYI 0 < INDEX DE LA MEMOIRE,
LX ALIMAG < NOMBRE DE MOTS A RAZER...
RAZ4: EQU $
XR X,Y
STZ &AIMAG2 < RAZ...
ADRI 1,X
XR X,Y
JDX RAZ4
<
< RECHERCHE D'UN POINT DE DEPART :
<
PLR B < B=+1/-1 : SENS DE RECHERCHE DE 'DEP'.
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.
DEP4: EQU $
LAD M1 < ERREUR : DEP=1 !!!
BSR APRINT
BR AGOGE < ABORT.
DEP1: EQU $
ADR B,Y < ACCES POINT AU-DESSOUS/AU-DESSUS.
LR Y,A
CP NLIG < VALIDATION DE Y.
JLE DEP2 < OK, Y DANS L'IMAGE.
LAD M2 < ERREUR, Y HORS L'IMAGE !!!!
BSR APRINT
BR AGOGE < 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 $
<
< DEP EST NOTRE POINT DE DEPART :
<
LX DEP+X
LY DEP+Y
BSR ASENDO < INSERTION POINT DE DEPART.
BSR ASETV < MARQUAGE DU POINT DE DEPART.
BSR ASETW < MEMORISATION DES LASTY...
<
< 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 $
STZ KAROT < RAZ DU COMPTEUR DES RETOURS A 'PTC'...
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 $
IC KAROT < ET UN RETOUR DE PLUS !!!
XKAROT:: VAL 4 < SEUIL DE TEST DE 'KAROT'...
LA KAROT
CPI XKAROT*4 < ???
JGE DEP4 < LE POINT DE DEPART EST SUREMENT DANS
< UN COULOIR !!!
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 $
IC ITEST < AFIN DE TESTER LES POINTS A 1...
<
< ELIMINATION DE L'ENTREE DANS UN COULOIR :
< (SOURCE DE LIGNE ET DE POINTS DOUBLES)
<
LA ANGLE
STA SANGLE
PSR X,Y
LAI 16
LBI 0
BSR AROT1
BSR AMOV
BSR AVOISY < "1ER DROITE"...
BSR AMOV
BSR AVOISY < "2EME DROITE"...
BSR AROT1
BSR AMOV
BSR AVOISY < "2EME ARRIERE-DROITE"...
BSR AROT1
BSR AMOV
BSR AVOISY < "1ER ARRIERE-DROITE"...
BSR AMOV
BSR AMOV
BSR AVOISY < "1ER ARRIERE-GAUCHE"...
BSR AMOV
BSR AVOISY < "2EME ARRIERE-GAUCHE"...
BSR AROT1
BSR AMOV
BSR AVOISY < "2EME GAUCHE"...
BSR AROT1
BSR AMOV
BSR AVOISY < "1ER GAUCHE"...
BSR AROT3
PLR X,Y
LA SANGLE
STA ANGLE
<
< DETECTION DES CONFIGURATIONS DANGEREUSES :
< ("A" SIGNIFIE "ARRIERE",
< "D" SIGNIFIE "DROITE",
< "G" SIGNIFIE "GAUCHE",
< "1" ET "2" SIGNIFIENT "1ER" ET "2EME")
<
LAI '81
BSR AMASK < D1 G1,
LAI '11
BSR AMASK < D1 AG1,
LAI '88
BSR AMASK < AD1 G1,
LAI '41
BSR AMASK < D1 G2,
LAI '21
BSR AMASK < D1 AG2,
LAI '82
BSR AMASK < D2 G1,
LAI '84
BSR AMASK < AD2 G1,
LAI '12
BSR AMASK < D2 AG1,
LAI '48
BSR AMASK < AD1 G2.
JMP CONT30
<
< SOUS-PROGRAMME DE DETECTION D'UNE CONFIGURATION DANGEREUSE :
< (DANS 'A' ON TROUVE LA FORME DE LA
< CONFIGURATION DANGEREUSE ; SI ELLE
< EST PRESENTE, ON VA BRUTALEMENT EN
< 'CONT5')
<
MASK: EQU $
PSR B < SAVE L'ETAT DES VOISINS...
ANDR A,B
CPR A,B < ???
JNE MASK1 < L'ETAT 'A' N'EST PAS PRESENT, OK...
ADRI -2,K < IL EST LA, ON EST DANS UN COULOIR !!!
JMP CONT5
MASK1: EQU $
PLR B
RSR
<
< CAS D'UN POINT NOIR QUI N'ENTRE PAS DANS UN COULOIR :
<
CONT30: 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).
LA KAROT < EST-ON EN TRAIN DE BOUCLER ???
CPI XKAROT*1
JL CONT32
CONT38: EQU $
BSR AROT3 < OUI, ON TOURNE NOS RECHERCHES...
CPI XKAROT*2
JL CONT32
BSR AROT3 < OUI, ENCORE !!!
CPI XKAROT*3
JGE DEP4 < ERREUR SUR LE POINT DE DEPART, IL EST
< SUREMENT DANS UN COULOIR...
CONT32: EQU $
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 AXISTV < LE POINT (X,Y) N'AURAIT-IL PAS ETE
< DEJA MARQUE ???
CPZ INDIC
JNE CONT34 < NON, ON LE MARQUE...
IC MULTI < OUI, ON MEMORISE LE FAIT QUE L'ON
< FAIT UN MARQUAGE BOUCLE !!!
LA MULTI
CPI 2
JG CONT5 < ET OUI...
JMP CONT35 < VERS LE MARQUAGE...
CONT37: EQU $
BR ALOOP < VERS 'CONT1'...
CONT34: EQU $
STZ MULTI < REINITIALISATION...
CONT35: EQU $
BSR ASETV < MARQUAGE DE (X,Y) S'IL EST NOIR...
BSR ASETW < MEMORISATION DES LASTY...
LR X,A
CP DEP+X < EST-ON AU POINT DE DEPART ???
JNE CONT37 < NON, AU SUIVANT...
LR Y,A
CP DEP+Y < EST-ON AU POINT DE DEPART ???
JNE CONT37 < NON, AU SUIVANT...
<
< ON A LE CONTOUR INTERIEUR :
<
CONT7: EQU $
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.
<
< QUE VOULEZ-VOUS : UN CONTOUR, OU BIEN UN REMPLISSAGE ???
<
CONT90: EQU $
LAD M8
BSR APRINT
LAD DEMREP
SVC 0 < LECTURE DE LA REPONSE.
LBY REP < A=CARACTERE REPONSE.
<
< REPONSES RECONNUES :
< N : ON NE CALCULE QUE LE CONTOUR EN SCRATCH,
< O : ON REMPLIT L'IMAGE.
<
CPI "O"
JE CONT91 < REMPLISSAGE.
CPI "N"
JNE CONT90 < RIEN COMPRIS : REINTERROGATION ???
BR AGOGE < CONTOUR : ON RETOURNE A GE, AVEC
< UN VIDAGE PREALABLE DE L'IMAGE
< VIRTUELLE EN SCRATCH.
CONT91: EQU $
BSR ACONTI < ON AMENE EN MEMOIRE IMAGE
< LE CONTOUR QUE L'ON A
< GENERE, CAR C'EST DE LUI
< QU'ON VEUT LES LIMITES !!!
<
< 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 NLIG
LR B,A
AD AIMAG
STA AIMAG0 < RELAI D'ACCES A LA DERNIERE
< LIGNE DE L'IMAGE.
LY NLIG < 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.
<
< R E M P L I S S A G E D U C O N T O U R :
<
CONT18: EQU $
BSR ARAZDK < CLEAR DE L'IMAGE VIRTUELLE.
<
< SUPPRESSION EVENTUELLE DES POINTS 0-ISOLES OU 1-ISOLES :
<
STZ ITEST
IC ITEST
ISOL8: EQU $
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 $
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).
PSR B < SAVE LE NOMBRE AVANT LES VERTICAUX...
BSR AVOISI
ADRI 1+1,Y < POINT (X,Y+1).
BSR AVOISI
ADRI -1,Y < RETOUR AU POINT (X,Y).
PLR A < A=NOMBRE DE VOISINS AVANT LES VERTICAUX.
SBR B,A
NGR A,A
CPR A,B
JNE ISOL93 < IL N'Y A PAS QUE DES VERTICAUX...
CPI 2
JNE ISOL93 < LE POINT N'A PAS 2 VOISINS VERTICAUX...
PSR C
LA ALIMAG
ADR A,C
BSR ATEST < LORSQU'UN POINT A 2 VOISINS VERTICAUX,
< ON REGARDE S'IL EST EN MEMOIRE LASTY...
PLR C
JC ISOL93 < OUI, ON LE GARDE...
BSR ARESET < NON, ON L'EFFACE...
ISOL93: EQU $
LR B,A < A=NBRE DE VOISINS DE (X,Y).
JANE ISOL10 < OK POINT 1-ISOLE AU MOINS...
BR ADEP4 < ERREUR SUR LE POINT DE DEPART, IL
< S'AGISSAIT SUREMENT D'UN POINT NOIR
< SEUL ENTRE PLEIN DE POINTS BLANCS...
ISOL10: EQU $
CPI 1
JG ISOL7 < ON LE GARDE...
<
< ELIMINATION DES POINTS 0-ISOLES ET 1-ISOLES :
<
ISOL12: EQU $
BSR ARESET < OUI, ON L'ELIMINE.
PSR Y,C
LA ALIMAG
ADR A,C
BSR ARESET < MAJ DE LA MEMOIRE DES LASTY.
ADRI 1,Y
BSR ARESET
PLR Y,C
IC NISOL < ET ON COMPTE LES POINTS
< AINSI EFFACES.
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.
<
<
< R E M P L I S S A G E D U C O N T O U R :
<
<
LY YMAX < Y=NUMERO DE LIGNE.
CONT20: EQU $
LXI 0 < X=NUMERO DE POINT SUR LA LIGNE.
CONT21: EQU $
BSR AEXIST < TEST DU POINT M(X,Y)...
JANE CONT22 < IL EST NOIR, OU IL N'EXISTE PAS !!!
<
< CAS OU ON TROUVE UN PREMIER POINT BLANC :
<
STZ KVOISH < COMPTAGE DES VOISINS DE DESSUS,
STZ KVOISB < COMPTAGE DES VOISINS DE DESSOUS.
<
< RECHERCHE DU PREMIER POINT NOIR SUIVANT LE PREMIER POINT BLANC :
<
CONT25: EQU $
BSR ASP1 < COMPTAGE DES VOISINS DESSUS/DESSOUS...
ADRI 1,X
LR X,A
CP NPPL
JG CONT23 < ON EST EN BOUT DE LIGNE, ON EN CHANGE.
BSR ATEST < TEST DU POINT (X,Y) ???
JC CONT25 < ENCORE UN BLANC...
BSR ASP2 < INFLEXION OU TANGENCE ???
JAE CONT21 < IL S'AGIT D'UNE TANGENCE HORIZONTALE,
< IL NE FAUT PAS REMPLIR...
<
< CAS D'UN POINT D'INFLEXION :
<
<
< MEMORISATION DE L'ORIGINE DU SEGMENT DE REMPLISSAGE :
<
CONT40: EQU $
LR Y,A
SB NLIG
NGR A,A
SLLS DEDY
STA SEGORG+Y
LR X,A
SLLS DEDX
STA SEGORG+X
<
< REMPLISSAGE D'UN SEGMENT NOIR :
<
CONT27: EQU $
BSR ATEST
JC CONT28 < ARRET SUR LE PREMIER POINT BLANC...
BSR ASETV < MARQUAGE DES POINT NOIRS...
ADRI 1,X < AU SUIVANT...
LR X,A
CP NPPL
JLE CONT27
CONT28: EQU $
STZ KVOISH < COMPTAGE DES VOISINS DE DESSUS,
STZ KVOISB < COMPTAGE DES VOISINS DE DESSOUS.
ADRI -1,X
<
< MEMORISATION DE L'EXTREMITE DU SEGMENT DE REMPLISSAGE :
<
LR Y,A
SB NLIG
NGR A,A
SLLS DEDY
STA SEGEXT+Y
LR X,A
SLLS DEDX
STA SEGEXT+X
BSR ASEND < ENVOI EVENTUEL EN 'ZDC'...
<
< ELIMINATION DES POINTS BLANCS A LA SUITE DU REMPLISSAGE :
<
CONT29: EQU $
ADRI 1,X
LR X,A
CP NPPL
JG CONT23 < CHANGEMENT DE LIGNE...
BSR ATEST < TEST DU POINT M(X,Y)...
JNC CONT47 < POINT NOIR, FIN DU SEGMENT BLANC...
BSR ASP1 < COMPTAGE DES VOISINS DESSUS/DESSOUS...
JMP CONT29 < VERS LE BLANC SUIVANT...
CONT47: EQU $
BSR ASP2 < INFLEXION OU TANGENCE ???
JAE CONT40 < IL FAUT REPRENDRE LE REMPLISSAGE CAR
< CE SEGMENT BLANC N'ETAIT PAS UN
< SEGMENT D'INFLEXION...
JMP CONT21 < DES QU'UN NOIR EST TROUVE, ON RECOMMENCE
< LE PROCESSUS...
<
< RECHERCHE D'UN POINT SUIVANT SUR LA LIGNE :
<
CONT22: EQU $
ADRI 1,X
LR X,A
CP NPPL
JLE CONT21 < ON RESTE SUR LA MEME LIGNE...
<
< CHANGEMENT DE LIGNE :
<
CONT23: EQU $
ADRI -1,Y
LR Y,A
CP YMIN
JGE CONT20 < VERS LA NOUVELLE LIGNE...
BR AGOGE < C'EST FINI...
PAGE
<
<
< I M P L A N T A T I O N :
<
<
X12: EQU ZERO+PILE-LTNI-LTNI
X10: VAL X12-$
ZEROV: EQU ZERO+X10 < ERREUR D'ASSEMBLAGE VOLONTAIRE
< SI MAUVAISE IMPLANTATION...
DZS X10+1 < PAR PROPRETE !!!!
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.