< S I S C M S 5 12
PAGE
PAGE
<
<
< D C T I N E X I S T A N T E :
<
<
DCTTSI: EQU $
PSTTSI: WORD K;K;K;K;COM+DEPCS;DCTTSI;NIL;PILTSI;HANDLR;SMST;SO;SE
#@ASCI " TSI" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XXDCTP < 'DCTTSI' N'EST PAS LOUABLE !!!
WORD XXLOC0
DZS LSEM
WORD NIL
WORD NIL
WORD XXCHV0
DZS LSEM
WORD XXSIT0
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLTSI
WORD HDLTSI
WORD K;K < ETAT
WORD XBITS0 < BITSEM
WORD XXNTRY;TRYVID
WORD K < HSTATS.
WORD XTESTO < TESTO.
WORD XXDCTF < 'DCT' NON CONNECTABLE...
WORD XFONBA < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
< ZONE VARIABLE :
<
VARTSI: EQU $
IF VARTSI-DCTTSI-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< PILE :
<
CALL #SISP CMS5 DOL2#
PILTSI: EQU $-DEPILE
XWPILE: VAL LPILEH+1
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< H A N D L E R D E S T A C H E S
< S O F T I N E X I S T A N T E S :
<
<
< A T T E N T I O N :
< 'TSI' N'EST PAS UNE TACHE RE-ENTRANTE,
< PUISQUE NE POSSEDANT QU'UNE 'DCT' ; OR,
< CELLE-CI EST REFERENCEE SOUS PLUSIEURS
< NIVEAUX DIFFERENTS. DANS UN CONTEXTE TRES
< VERREUX, CELA POURRAIT AVOIR DES CONSE-
< QUENCES FACHEUSES SUR LA MISE A POINT !!!
<
<
HDLTSI: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
RSR
PAGE
<
<
< T A C H E S H A R D S I N E X I S T A N T E S :
<
<
CALL #SISP CMS5 CHECK#
<
<
< P I L E S :
<
<
LPLTHI:: VAL LPILEH < LONGUEUR DES PILES DE 'THI'...
XWPILE: VAL LPLTHI
PILTH3: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTH5: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTH7: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTH8: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTH9: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTHA: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTHB: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
PILTHC: EQU $-DEPILE
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
<
<
< C O D E D E ' T H I ' :
<
<
THI: EQU $
TH03: EQU THI
TH05: EQU THI
TH07: EQU THI
TH08: EQU THI
TH09: EQU THI
TH0A: EQU THI
TH0B: EQU THI
TH0C: EQU THI
<
<
< FONCTION :
< CETTE TACHE POSSEDE UN PROLOGUE ET
< STANDARD, ET UN EPILOGUE.
< ENTRE LES DEUX, ELLE BOUCLE SUR UN
< APPEL A SYSER QUI BOUCLERA SUR UN
< APPEL A TDEFS (PUISQUE LES IT SONT
< MASQUEES).
< ON POURRA REPARTIR EN PROVOQUANT
< UN DEFAUT SECTEUR.
<
<
XWKNIV: VAL NTH0-I < UN QUELCONQUE NIVEAU INEXISTANT
< POUR APPELER 'SI CMS5 THDEB' QUI
< GENERERA UN PROLOGUE STANDAUD
CALL #SISP CMS5 THDEB#
BSR ASYSER < E R R E U R S Y S T E M E ...
BSR ARRSTF < EPILOGUE.
JMP THI < ET C'EST TOUT...
PAGE
<
<
< T A C H E H A R D N I V E A U 1 :
<
<
< FONCTION :
< CETTE TACHE HARDWARE UN PEU SPECIALE
< EST DESTINEE A TRAITER LES INCESSANTS
< DEFAUTS SUR LE 'CBM' DE LA TELEVISION
< BASSE DEFINITION ATTEINTE PAR LA 'CDAI'...
<
<
XSNCBM:: VAL 6 < NUMERO DU SOUS-NIVEAU D'INTERRUPTION
< DU 'CBM' CONNU...
LOCTH1: EQU $ < LOCAL NECESSAIRE AU 'CBM' :
<
< DONNEES D'ACCES AU 'CBM' :
<
T1ETA2: WORD ACCBM?FPHIN < LECTURE DU MOT D'ETAT2 :
XCBMX:: VAL ETAPAR < BIT INDIQUANT UNE MEMOIRE INEXISTANTE,
XCBMXL:: VAL ETAVIO < BIT INDIQUANT QUE LA MEMOIRE NE RENVOIE
< PAS LES INFORMATIONS DEMANDEES.
T1ETA1: WORD ACCBM?FPHETB < LECTURE DU MOT D'ETAT1,
T1CMD: WORD ACCBM?FPHCMD < SORTIE D'UNE COMMANDE AU 'CBM'.
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTH1: EQU $-DEPILE
XWPILE: VAL LPILTH < LONGUEUR DE LA PILE DE 'TH01'.
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVCBM < NIVEAU DE LA TACHE HARD.
CALL #SISP CMS5 THDEB#
<
< ACCES AU SOUS-NIVEAU EN CAUSE :
<
ACK < RECHERCHE DES SOUS-NIVEAUX EN ATTENTE :
LR X,A
CPI XSNCBM < EST-CE LE 'CBM' ???
JE SYSCBM < OUI, C'EST BON...
BSR ASYSER < E R R E U R S Y S T E M E ...
JMP CBMOK1 < ET ON SORT TOUT DE SUITE, QUOI FAIRE
< D'AUTRE ???
SYSCBM: BSR ASYSER < E R R E U R S Y S T E M E ...
< SYSER DES DEFAUTS SUR 'CBM' DE LA 'TV'.
<
< INITIALISATION DU PROCESSUS :
<
CALL #SISP CMS5 W TRACE#
LAI NPCBM
BSR ATRACE < TRACE DU DEFAUT SUR LE 'CBM'...
LRM A,B,W
WORD SLOCBM < (A)='SLO' SPECIAL DU 'CBM',
WORD SLECBM < (B)='SLE' SPECIAL DU 'CBM',
WORD LOCTH1 < 'W' BASE LE "LOCAL" DE 'TH01'...
WOE < POSITIONNEMENT DE 'SLO' ET 'SLE'.
<
< TENTATIVE DE CLEAR DU 'CBM' :
<
CBMNOK: EQU $ < CAS DU 'CBM' EN MANUEL...
SIO T1ETA2-LOCTH1,W < LECTURE DU MOT D'ETAT2.
LAI CBMDIS
SIO T1CMD-LOCTH1,W < ON DISJOINT LE 'CBM'.
LAI CBMJON
SIO T1CMD-LOCTH1,W < ON JOINT LE 'CBM'.
SIO T1ETA2-LOCTH1,W < LECTURE DU MOT D'ETAT2,
TBT ETAOPE < LE 'CBM' EST-IL JOINT ET PRESENT ???
JC CBMOK2 < OUI, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
< LE 'CBM' DOIT ETRE EN MANUEL...
JMP CBMNOK < SI LE 'CBM' EST PRESENT, IL FAUT LE
< METTRE EN AUTOMATIQUE... ET RETENTER
< LA JONCTION...
JMP CBMOK1 < S'IL EST ABSENT, IL FAUT SAUTER LE
< 'STAR', GARE AUX ALARMES !!!
CBMOK2: EQU $
LA MEMV
TBT MEMXXX < DOIT-ON INITIALISER LE FILTRE D'ADRESSE ?
JNC CBMOK3 < NON...
< OUI :
LAI K < (A)=VALEUR ARBITRAIRE...
LYI K < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
STAR < ON ECRIT AINSI LE FILTRE D'ADRESSE...
CBMOK3: EQU $
SIO T1ETA1-LOCTH1,W < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
< UNE EVENTUELLE INTERRUPTION PUPITRE...
SIO T1ETA2-LOCTH1,W < ON RELIT LE MOT D'ETA2 :
RBT ETAOPE < A PRIORI, CE N'EST PAS UN DEFAUT...
JAE CBMOK1 < EFFECTIVEMENT, TOUT EST BON...
SYSCBN: BSR ASYSER < E R R E U R S Y S T E M E ...
< SYSER DE DEFAUT RECALCITRANT SUR
< LE 'CBM' DE 'TV'.
<
< ET RETOUR :
<
CBMOK1: EQU $
BSR ARRSTF < EPILOGUE...
JMP TH01 < ET C'EST TOUT...
PAGE
<
<
< T A C H E H A R D N I V E A U 2 :
<
<
< FONCTION :
< CETTE TACHE HARDWARE UN PEU SPECIALE
< EST DESTINEE A TRAITER LES INCESSANTS
< DEFAUTS SUR LE 'CBJ' DE LA TELEVISION
< MOYENNE DEFINITION ATTEINTE PAR LA 'CDAJ'...
<
<
XSNCBJ:: VAL 6 < NUMERO DU SOUS-NIVEAU D'INTERRUPTION
< DU 'CBJ' CONNU...
LOCTH2: EQU $ < LOCAL NECESSAIRE AU 'CBJ' :
<
< DONNEES D'ACCES AU 'CBJ' :
<
T2ETA2: WORD ACCBJ?FPHIN < LECTURE DU MOT D'ETAT2,
T2ETA1: WORD ACCBJ?FPHETB < LECTURE DU MOT D'ETAT1,
T2CMD: WORD ACCBJ?FPHCMD < SORTIE D'UNE COMMANDE AU 'CBJ'.
<
< DONNEES D'ACCES A LA 'CDA' COURANTE :
<
T2CDO: WORD OCDA < ACCES A L'ORIGINE,
T2CDE: WORD ECDA < ACCES A L'EXTREMITE.
<
< DONNEES NECESSAIRES POUR
< SAVOIR S'IL FAUT IGNORER
< LES MEMOIRES INEXISTANTES :
<
T2MEX: WORD MEMINX < ADRESSE DE L'INDICATEUR EN MEMOIRE
< DEBANALISEE...
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTH2: EQU $-DEPILE
XWPILE: VAL LPILTH < LONGUEUR DE LA PILE DE 'TH02'.
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVCBJ < NIVEAU DE LA TACHE HARD.
CALL #SISP CMS5 THDEB#
<
< ACCES AU SOUS-NIVEAU EN CAUSE :
<
ACK < RECHERCHE DES SOUS-NIVEAUX EN ATTENTE :
LR X,A
CPI XSNCBJ < EST-CE LE 'CBJ' ???
JE SYSCBJ < OUI, C'EST BON...
BSR ASYSER < E R R E U R S Y S T E M E ...
JMP CBJOK1 < ET ON SORT TOUT DE SUITE, QUOI FAIRE
< D'AUTRE ???
SYSCBJ: BSR ASYSER < E R R E U R S Y S T E M E ...
< SYSER DES DEFAUTS SUR 'CBJ' DE LA 'TV'.
<
< INITIALISATION DU PROCESSUS :
<
CALL #SISP CMS5 W TRACE#
LAI NPCBJ
BSR ATRACE < TRACE DU DEFAUT SUR LE 'CBJ'...
LRM A,B,W
WORD SLOCBM < (A)='SLO' SPECIAL DU 'CBM',
WORD SLECBM < (B)='SLE' SPECIAL DU 'CBM',
WORD LOCTH2 < 'W' BASE LE "LOCAL" DE 'TH02'...
WOE < POSITIONNEMENT DE 'SLO' ET 'SLE'.
<
< TENTATIVE DE CLEAR DU 'CBJ' :
<
CBJNOK: EQU $ < CAS DU 'CBJ' EN MANUEL...
SIO T2ETA2-LOCTH2,W < LECTURE DU MOT D'ETAT2.
TBT XCBMX < Y-A-T'IL UNE MEMOIRE INEXISTANTE ???
JC CBJNK1 < OUI...
TBT XCBMXL < LA MEMOIRE RENVOIE-T'ELLE LES INFORMA-
< TIONS DEMANDEES ???
JNC CBJOK4 < OUI, OK...
<
< CAS DES MEMOIRES INEXISTANTES :
< (LE PROBLEME EST DELICAT ; EN
< EFFET, L'INTERRUPTION MEMOIRE
< INEXISTANTE SUR LE 'CBJ' EST
< ASYNCHRONE PAR RAPPORT AU PRO-
< GRAMME QUI L'A CAUSEE, ET NE
< RESSEMBLE DONC EN RIEN A UNE
< TRAPPE ; EN PARTICULIER LA TACHE
< INTERROMPUE PAR L'INTERRUPTION
< COURANTE PEUT TRES BIEN NE PAS
< ETRE CELLE QUI EST LA CAUSE
< DE LA MEMOIRE INEXISTANTE, OU
< SI C'EST ELLE, SES REGISTRES
< NE POINTENT PLUS SUR L'INSTRUCTION
< EN COURS ; CE QUE L'ON VA DONC
< FAIRE ICI, C'EST ESPERER QUE LA
< TACHE EN CAUSE VA REDEMANDER
< UN PEU PLUS LOIN LA 'CDAJ', ET
< ON VA LUI FORCER UNE VRAIE TRAPPE
< EN PERMUTANT 'CDESCO' ET 'CDESCE'...
< CE N'EST DONC PAS UN PROCEDE
< SUR A CENT POUR CENT... DE PLUS
< IL DEMANDE QUE "!CDAJ..." ET
< "!ACTIVITE ON" S'EXCLUENT L'UNE
< L'AUTRE)
<
CBJNK1: EQU $
IF XMEMXI-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ &T2MEX-LOCTH2,W < PEUT-ON IGNORER CETTE ALARME ???
JE CBJOK4 < OUI, DONC ON NE VA PAS TENTER DE TRANS-
< METTRE LA TRAPPE A L'UTILISATEUR...
PSR X,W < SAUVEGARDE DE LA BASE D'ACCES AUX ARGU-
< MENTS DU 'CBJ'...
LXI NESCLA-Z < POUR INDEXER LES UITILISATEURS :
< (X)='IDESC'...
CBJNK2: EQU $
LA &ATBU < (A)=ADRESSE DE LA 'DCTESC' D'IDESC=(X),
JALE CBJNK3 < L'UTILISATEUR (X) N'EXISTE PAS, OU EST
< EN TRAIN DE FAIRE UN LOGOUT...
LR A,W < (W)=ADRESSE DE LA 'DCTESC' DE L'UTILISA-
< D'IDESC=(X),
LA CDESCO-DCTESC,W < (A)=ORIGINE DE SA 'CDA' COURANTE,
TBT BMCDAJ < A-TIL LA 'CDAJ' ???
JC CBJNK4 < OUI...
CBJNK3: EQU $
ADRI -I,X < DANS LE CAS D'UN UTILISATEUR INEXISTANT,
< EN LOGOUT, OU NE POSSEDANT PAS LA 'CDAJ',
< ON PASSE A L'UTILISATEUR PRECEDENT...
CPZR X < EXISTE-T'IL ???
JGE CBJNK2 < OUI...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< SI AUCUN UTILISATEUR N'A
< LA 'CDAJ', C'EST QU'ON EST
< EN PHASE "!ACTIVITE ON", ON
< A DONC INTERET LA FAIRE "OFF" !!!
<
CBJNK8: EQU $
PLR X,W < RESTAURATIONS...
JMP CBJOK4 < VERS LE CLEAR DU 'CBJ'...
CBJNK4: EQU $
LB CDESCE-DCTESC,W < ON A TROUVE L'UTILSATEUR QUI EST LA
< CAUSE DE LA MEMOIRE INEXISTANTE :
< (A)=ORIGINE DE SA 'CDAJ',
< (B)=EXTREMITE DE SA 'CDAJ'...
CPR A,B < VALIDONS :
JG CBJNK6 < OK : ORIGINE (A) < EXTREMITE (B)...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT ORIGINE
< ET EXTREMITE PEUVENT ETRE
< INVERSEES (DEUX INTERRUPTIONS
< SUCCESSIVES...) !!!
< CELA PEUT PEUT-ETRE S'EXPLIQUER
< DE LA FACON SUIVANTE : SI MEMXXX=1,
< ON EXECUTE UN 'STAR' UN PEU PLUS
< LOIN, OR CE 'STAR', CONTRAIREMENT A
< CE QUI EST DIT, PROVOQUE UN VERI-
< TABLE ECHANGE, ET PEUT DONC A SON
< TOUR PROVOQUER UNE MEMOIRE INEXIS-
< TANTE, ET DONC UNE RERENTRER PLUS
< OU MOINS IMMEDIATEMENT DANS 'TH2',
< D'OU CETTE 'SYSER' LORS DE CETTE
< RERENTREE ; ON VERIFIERA A CE
< PROPOS LA TRACE (IL SUFFIT DE DE-
< MASQUER LES INTERRUPTIONS, DE
< REEXECUTER LE 'BSR''ASYSER' ; MAIS
< N'OUBLIONS PAS QU'ON SE TROUVE DANS
< LE CAS OU DES TACHES HARDWARES SE
< TROUVENT IMBRIQUEES, CE QUI EST
< IMPOSSIBLE DE PAR LE MASQUAGE, ET
< PROVOQUE DONC UNE 'SYSER' DANS LE
< MODULE 'RRSTF' PAR DECOMPTAGE DE
< LA VARIABLE 'COMPTH'...)
<
JMP CBJNK8 < ET ON NE RE-PERMUTE PAS...
CBJNK6: EQU $
STA CDESCE-DCTESC,W < ON PERMUTE ORIGINE ET EXTREMITE, EN
STB CDESCO-DCTESC,W < ESPERANT QUE L'UTILISATEUR VA REUTILI-
< SER LA 'CDAJ' TOUT DE SUITE, ET SANS
< RENVOYER DE "!CDAJ..."...
CBJNK5: EQU $
PLR X,W < RESTAURATION DE 'W'...
LA &T2CDO-LOCTH2,W < (A)=ADRESSE DE LA 'CDA' COURANTE,
TBT BMCDAJ < EST-CE LA 'CDAJ' ???
< NOTONS QU'ON EST OBLIGE DE FAIRE CE
< TEST SUPPLEMENTAIRE, CAR IL N'EST PAS
< EVIDENT QU'APRES LA PERMUTATION DE
< 'CDESCO' ET 'CDESCE' LE SCHEDULER PRENNE
< LA MAIN, ET AINSI PROVOQUE LA VIOLATION
< MEMOIRE TANT ATTENDUE...
JNC CBJNK7 < NON, DONC RIEN A FAIRE...
LB &T2CDE-LOCTH2,W < OUI :
< (B)=ADRESSE DE FIN,
CPR A,B < LA 'CDA' COURANTE QUI EST LA 'CDAJ', ET
< DONC POUR L'UTILISATEUR COURANT EST-ELLE
< DEJA PERMUTEE ???
JLE CBJNK7 < OUI, RIEN A FAIRE...
STB &T2CDO-LOCTH2,W < NON,
STA &T2CDE-LOCTH2,W < ON PERMUTE LA 'CDA' COURANTE...
CBJNK7: EQU $
<
< TENTATIVE DE CLEAR DU 'CBJ' :
<
CBJOK4: EQU $
LAI CBMDIS
SIO T2CMD-LOCTH2,W < ON DISJOINT LE 'CBJ'.
LAI CBMJON
SIO T2CMD-LOCTH2,W < ON JOINT LE 'CBJ'.
SIO T2ETA2-LOCTH2,W < LECTURE DU MOT D'ETAT2,
TBT ETAOPE < LE 'CBJ' EST-IL JOINT ET PRESENT ???
JC CBJOK2 < OUI, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
< LE 'CBJ' DOIT ETRE EN MANUEL...
JMP CBJNOK < SI LE 'CBJ' EST PRESENT, IL FAUT LE
< METTRE EN AUTOMATIQUE... ET RETENTER
< LA JONCTION...
JMP CBJOK1 < S'IL EST ABSENT, IL FAUT SAUTER LE
< 'STAR', GARE AUX ALARMES !!!
CBJOK2: EQU $
LA MEMV
TBT MEMXXX < DOIT-ON INITIALISER LE FILTRE D'ADRESSE ?
JNC CBJOK3 < NON...
< OUI :
LAI K < (A)=VALEUR ARBITRAIRE...
LYI K < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
STAR < ON ECRIT AINSI LE FILTRE D'ADRESSE...
CBJOK3: EQU $
SIO T2ETA1-LOCTH2,W < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
< UNE EVENTUELLE INTERRUPTION PUPITRE...
SIO T2ETA2-LOCTH2,W < ON RELIT LE MOT D'ETA2 :
RBT ETAOPE < A PRIORI, CE N'EST PAS UN DEFAUT...
JAE CBJOK1 < EFFECTIVEMENT, TOUT EST BON...
SYSCBK: BSR ASYSER < E R R E U R S Y S T E M E ...
< SYSER DE DEFAUT RECALCITRANT SUR
< LE 'CBJ' DE 'TV'.
CBJOK1: EQU $
BSR ARRSTF < EPILOGUE...
JMP TH02 < ET C'EST TOUT...
PAGE
<
<
< T A C H E H A R D W A R E 4 :
<
<
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTH4: EQU $-DEPILE
XWPILE: VAL LPILTH
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVTH4
CALL #SISP CMS5 THDEB#
LAI YTRAN4 < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
LYI NTRAN4 < NOMBRE DE TRANSLATIONS POUR
< OBTENIR LE SOUS-NIVEAU D'INTERRUPTION
< GENERALISE...
BSR ATIT < TRAITEMENT DE L'IT.
BSR ARRSTF < EPILOGUE...
JMP TH04
PAGE
<
<
< T A C H E H A R D W A R E 6 :
<
<
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTH6: EQU $-DEPILE
XWPILE: VAL LPILTH
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVTH6
CALL #SISP CMS5 THDEB#
LAI YTRAN6 < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
LYI NTRAN6 < NOMBRE DE TRANSLATIONS POUR
< OBTENIR LE SOUS-NIVEAU D'INTERRUPTION
< GENERALISE...
BSR ATIT < TRAITEMENT DE L'IT.
BSR ARRSTF < EPILOGUE...
JMP TH06
PAGE
<
<
< T A C H E H A R D W A R E ' D :
<
<
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTHD: EQU $-DEPILE
XWPILE: VAL LPILTH
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVTHD
CALL #SISP CMS5 THDEB#
LAI YTRAND < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
LYI NTRAND < NOMBRE DE TRANSLATIONS
< POUR OBTENIR LE SOUS-
< NIVEAU D'INTERRUPTION GENERALISE...
BSR ATIT < TRAITEMENT DE L'IT.
BSR ARRSTF < EPILOGUE...
JMP TH0D
PAGE
<
<
< T A C H E H A R D W A R E ' E :
<
<
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTHE: EQU $-DEPILE
XWPILE: VAL LPILTH
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVTHE
CALL #SISP CMS5 THDEB#
LAI YTRANE < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
LYI NTRANE < NOMBRE DE TRANSLATIONS
< POUR OBTENIR LE SOUS-
< NIVEAU D'INTERRUPTION GENERALISE...
BSR ATIT < TRAITEMENT DE L'IT.
BSR ARRSTF < EPILOGUE...
JMP TH0E
PAGE
<
<
< T A C H E H A R D W A R E ' F :
<
<
<
< PILE :
<
CALL #SISP CMS5 CHECK#
PILTHF: EQU $-DEPILE
XWPILE: VAL LPILTH
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
XWKNIV: VAL NIVTHF
CALL #SISP CMS5 THDEB#
LAI YTRANF < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
LYI NTRANF < NOMBRE DE TRANSLATIONS
< POUR OBTENIR LE SOUS-
< NIVEAU D'INTERRUPTION GENERALISE...
BSR ATIT < TRAITEMENT DE L'IT.
BSR ARRSTF < EPILOGUE...
JMP TH0F
<
<
< A T T E N T I O N :
< (W)=0 : UTILISE PAR LA TRACE !!!
<
<
PAGE
<
<
< T R A I T E M E N T C E N T R A L I S E
< D E S I N T E R R U P T I O N S :
<
<
< FONCTION :
< CE SOUS-PROGRAMME APPELE PAR
< TOUTES LES TACHES HARDWARES
< RECUPERE LE SOUS-NIVEAU APPELANT,
< EN DEDUIT LA TACHE ASSOCIEE, ET
< PASSE LA MAIN A L''ARIT' ASSOCIE...
<
<
< ARGUMENTS :
< (Y)=TRANSLATION POUR CALCULER
< LE SOUS-NIVEAU D'IT GENERALISE
< (A)=NOMBRE MAX DE SOUS-NIVEAUX DU NIVEAU COURANT.
<
<
TIT: EQU $
CALL #SISP CMS5 W TRACE# < (W)=0 POUR LA TRACE...
TITACK: EQU $
LBI TYPITN < POUR LE TEST DU 'CARY' EVENTUEL...
ACK < 'X' RECOIT LE NUMERO DU SOUS-NIVEAU LE
< PLUS PRIORITAIRE EN ATTENTE SOUS CE
< NIVEAU, ET
< 'S' RECOIT :
< (C)=1 : SI SOUS-NIVEAU EXCEPTION,
< (V)=1 : SI SOUS-NIVEAU NORMAL,
< (V)=(C)=0 : S'IL N'Y A PLUS DE SOUS-
< NIVEAUX EN ATTENTE...
JNCV TITFIN < PLUS DE SOUS-NIVEAUX EN ATTENTE...
<
< CAS OU IL RESTE AU MOINS
< UN SOUS-NIVEAU EN ATTENTE :
<
ADCR B < (B)=1 : SOUS-NIVEAU EXCEPTION,
< =0 : SOUS-NIVEAU NORMAL.
PSR A,Y < SAUVEGARDE DES ARGUMENTS...
CPR A,X < LE SOUS-NIVEAU EXISTE-T'IL ???
JL TITS2 < OUI : (X)<(A)...
BSR ASYSER < E R R E U R S Y S T E M E ...
JMP TITS3 < ET C'EST TOUT...
TITS2: EQU $
LR X,L < (L)=NUMERO DE SOUS-NIVEAU,
ADR Y,X
LR X,A < (A)=NIVEAU D'INTERRUPTION GENERALISE,
PSR B,L
BSR ATRACE < QUE L'ON TRACE...
<
< RECUPERATION DU HANDLER CONCERNE :
<
BSR ACBDCT < RECUPERATION ADRESSE DCT DANS 'A' ET 'L'.
JAG SYSRB1 < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< PEUT ETRE METTRE 'DCTTSI' DANS 'A' ET 'L',
< OU PLUS PRUDEMMENT 'PLR B,X', ET PUIS
< UN 'JMP TITS3'...
<
SYSRB1: EQU $
USE L,DCT0
LA TESTO < FAUT-IL TESTER LE TIME-OUT ???
JAE TITS1 < NON, LE TIME-OUT N'EST PAS A TESTER SUR
< CE HANDLER...
STA TIMOUT < OUI, IL EST A TESTER, ALORS :
< ON REINITIALISE APRES CHAQUE IT
< LE COMPTEUR COURANT DE TIME OUT
< AU CAS OU LE HANDLER NE SERAIT PAS
< A UNE FIN DE SERVICE...
TITS1: EQU $
PLR B,X < PARAMETRES DE L'ARIT :
< (B)=0 : SOUS-NIVEAU NORMAL,
< =1 : SOUS-NIVEAU EXCEPTION.
< (X)=NUMERO DU SOUS-NIVEAU.
BSR ARIT < APPEL DE LA ROUTINE SPECIFIQUE DU
< PERIPHERIQUE.
<
< PASSAGE A L'EVENTUEL SOUS-
< NIVEAU SUIVANT :
<
TITS3: EQU $
PLR A,Y
BSR ATDEFS < SOYONS PRUDENT : Y-A-T'IL UN DEFAUT
< DEFAUT SECTEUR EN ATTENTE ???
JMP TITACK < PUIS, VERS LE SOUS-NIVEAU SUIVANT EN
< ATTENTE...
TITFIN: EQU $
RSR
PAGE
<
<
< T E S T D U M O D E D ' E X E C U T I O N
< D U S Y S T E M E E T E P I L O G U E
< D E S T A C H E S H A R D W A R E S :
<
<
< FONCTION :
< CE SOUS-PROGRAMME APPELE PAR
< TOUTES LES TACHES HARDWARES EST
< EN FAIT LE PENDANT DE #SISP CMS5 THDEB# ;
< IL CONSTITUE L'EPILOGUE DE TOUTES
< LES TACHES HARDWARES. IL TESTE LE
< MODE D'EXECUTION DU SYSTEME (VOIR
< LA FILE 'RSTF' ET 'CHECK AND TRACE'),
< IL TESTE DE PLUS POUR 'TH0' (ALAR-
< MES) LES 'IPI' EN ATTENTE (CEUX DU
< DIALOGUE MAITRE <--> ESCLAVE), PUIS
< RESTAURE LES REGISTRES, ET DESARME
< LE NIVEAU...
<
<
<
<
< E N T R Y T H 0 :
<
<
FITH0: EQU $
LXI NSPPR1
BSR ACADCT < RENVOIE (L)=ADRESSE DE 'DCTPR1', DETRUIT
< LA BASE 'L' MAIS SANS IMPORTANCE...
LBI TYPITN < AFIN DE DISTINGUER L'HORLOGE (TIME
< OUT) DES APPELS NORMAUX ('IPI').
BSR ARIT < AINSI, ON PREND EN COMPTE LES 'IPI'
< INTER-PROCESSEURS S'ILS SONT VALIDES.
<
<
< E N T R Y T H 1 A T H 1 5 :
<
<
RRSTF: EQU $
LXI LOFDMS
LA &ARSTF < ACCES AU DERNIER MOT SIGNIFICATIF
< DE RSTF ; S'IL VAUT -1 ('FFFF),
< C'EST QU'ON NE TRACE PAS TOUS
< LES CHANGEMENTS DE CONTEXTE.
CPI MMOT
JE E964 < SI =-1, ON LAISSE RSTF TELLE
< QU'ELLE EST...
<
< CAS OU ON TRACE TOUS LES CHANGEMENTS DE CONTEXTE :
<
Z2000: EQU $
STZ &ARSTF < RAZ DE TOUTE RSTF A PRIORI,
< POUR NE PAS PERDRE DE CHANGE-
< MENTS DE CONTEXTES.
JDX Z2000
LXI NTS0
LYI FONSB1
LAD ARSTF
BSR ATMOBT < A PRIORI, ON FOCE LE BIT 'RSTF' DE
< LA TACHE 'CHECK AND TRACE'...
E964: EQU $
<
< RECUPERATION DES REGISTRES DE LA TACHE INTERROMPUE :
<
LR K,W
LY O,W < (Y)=ADRESSE DE RETOUR ('P' D'APPEL).
LA -D,W < (A)=ADRESSE DE 'IC' ('L' EMPILEE).
LR A,W < (W)=ADRESSE DE 'IC'.
LA HK-PSTH,W < (A)=VALEUR INITIALE DE 'K'.
LR A,B
ADRI DEPILE,A < (A)=@EMETTEUR=BASE DE LA PILE,
ADRI DEPILE+D,B < (B)=@RECEPTEUR=PILE DECALEE D'UN MOT.
LXI LREGTH < 9 REGISTRES EMPILES A DECALER...
MOVE < TRANSLATION D'UN MOT DE LA PILE.
LA HK-PSTH,W < (A)=VALEUR INITIALE DE 'K'.
LR A,W
STY D,W < "EMPILEMENT" DE L'ADRESSE DE RETOUR
< AU BAS DE LA PILE...
<
< "DECOMPTAGE" DES TACHES HARDWARES :
<
DC COMPTH
JE E964XY < EN EFFET, ELLE NE PEUT VALOIR QUE 0/1...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< REGARDER EN PARTICULIER S'IL N'Y A PAS
< EU PRECEDEMMENT UN DEFAUT SECTEUR DANS UNE
< TACHE HARDWARE...
<
STZ COMPTH < ET ON REINITIALISE...
E964XY: EQU $
<
<
< E P I L O G U E D E T A C H E H A R D :
<
PLR L
LR L,C
< RESTAURATION DE (SLO,SLE) :
CALL #SISP CMS5 PLRSLO#
STZ ICSAV-PSTH,L
PLR L,W < RESTAURATION L,W,...
PLR A,B,X,Y < ...A,B,X,Y
ACQ < ET DESARMEMENT...
RSR < POUR LA PROCHAINE IT, PROVOQUE ALORS UN
< RETOUR SUR UNE INSTRUCTION 'JMP THXX'...
PAGE
<
<
< A T T E N T E I T E T C L E A R S I T :
<
<
< FONCTION :
< SUITE A CERTAINS PROBLEMES SUR
< L'HORLOGE (CAS OU ELLE SE TROUVE
< BLOQUEE SUR UNE ATTENTE DISQUE,...), IL
< APPARAIT NECESSAIRE DE CREER CETTE
< ROUTINE, QUI MET LE HANDLER
< APELANT EN ATTENTE D'INTERRUPTION
< SUR SON SEMAPHORE SIT, PUIS LORSQUE
< L'IT EST ARRIVEE, RE-INITIALISE SIT. AINSI
< SI PLUSIEURS IT SONT MONTEES POUR LE
< MEME EVENEMENT, LORS DES ECHANGES
< SUIVANTS, ON NE SE DESYNCHRONISERA
< PAS...
<
<
< NOTA :
< ON NE PEUT INVERSER L'ATTENTE
< DE L'INTERRUPTION ET LE CLEAR DU
< BETA(SEMAPHORE), EN EFFET DANS LE
< CAS OU DES DEFAUTS IMMEDIATS
< APPARAISSENT, L'IT MONTE
< AVANT QU'ON NE SE METTE EN ATTENTE !!!!
<
<
< A T T E N T I O N :
< POUR BIEN FAIRE, IL FAUDRAIT
< QUE LA REMISE A 0 DU BETA(SIT) SOIT
< PROTEGE DES DEFAUTS SECTEUR, CE QUI
< EST EVIDEMMENT IMPOSSIBLE. EN
< CONSEQUENCES, IL SE PEUT QUE
< 'CSWIT' ET 'THDS' INTERFERENT DANGEREU-
< SEMENT LORS DE DEFAUTS SECTEUR
< MALENCONTREUX...
<
<
< ARGUMENT :
< (L)=ADRESSE DCT(HANDLER).
<
<
USE L,DCT0
CSWIT: EQU $
RQST SIT < A T T E N T E I N T E R R U P T I O N.
<
< I N T E R R U P T I O N A P P A R U E :
<
STZ SIT < RAZ DU SIT
RSR < RETOUR A L'APPELANT LORSQUE
< LA REINITIALISATION EST FAITE.
PAGE
<
<
< R E V E I L D ' U N H A N D L E R :
<
<
< ARGUMENT :
< - (L)=ADRESSE DCT(HANDLER).
<
<
USE L,DCT0
REVHDL: EQU $
PSR A
<
< VALIDATION DU 'SIT' :
<
BSR ABETA2 < RENVOIE : (A)=BETA(SIT).
CPI MAXBET < TEST SUR LE NBRE D'IT MONTEES
< SUR CE SEMAPHORE ET NON ENCORE
< TRAITEES.
JL E885 < ACCEPTABLE...
BSR ASYSER < E R R E U R S Y S T E M E ...
< ON SAIT LES RISQUES ENCOURUS
< LORSQUE CE TEST N'EST PAS FAIT :
< LE SEMAPHORE RISQUE DE REDEVENIR
< NEGATIF EN PASSANT AU DELA
< DE '7F, ET LA MICRO-MACHINE
< SE MET A RAZER TOUS LES BITS
< A 1 QUI SUIVENT LE BETA (...).
<
< QUE FAIRE ???
< ALLER MODIFIER EN GENERAL LE
< 'BETA' DU SEMAPHORE, OU BIEN
< FAIRE UN 'JMP E885X'...
<
IF XXSIT0-K,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
STZ SIT < ON REINITIALISE LE 'SIT'...
E885: EQU $
<
< REVEIL DU HANDLER :
<
LAD SIT
BSR ARLSE < REVEIL DU HANDLER QUI DORT SUR 'SIT'...
<
< ET RETOUR :
<
PLR A
RSR
PAGE
<
<
< S U P E R - I D L E :
<
<
< FONCTION :
< CETTE TACHE REMPLACE JUSTE APRES LE
< 'SYSINI' LA TACHE 'INI' ; CECI AVEC
< DEUX CONSEQUENCES :
< 1 - LA DCT QUI EST RELAYEE PAR 'NSPINI'
< (='NSPIDS') EXISTE DE NOUVEAU, ET ON NE
< RISQUE PAS DE PARTIR DANS LE DECORS...
< 2 - SI PAR UN MALHEUREUX HASARD, 'IDLE'
< SE TROUVAIT BLOQUEE, ON LE DETECTERAIT...
<
<
CALL #SISP CMS5 CHECK#
<
<
< ' D C T ' D E L A S U P E R - I D L E :
<
<
CALL #SISP CMS5 DOL1#
DCTIDS: EQU $
PSTIDS: WORD K;K;K;K;COM+DEPCS;NIL;NIL;PILIDS;IDLSUP;SMST;SO;SE
#@ASCI " IDS" < #SISP CMS5 ASCI#
<
<
< P I L E D E L A S U P E R - I D L E :
<
<
CALL #SISP CMS5 DOL2#
PILIDS: EQU $-DEPILE
XWPILE: VAL 8 < INCREMENT DE LA PILE...
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
<
<
< S U P E R - I D L E :
<
<
USE L,DCT0
IDLSUP: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
ACQ < POUR FORCER UN PASSAGE AU MICRO
< SCEDULER, ET UN DEMASQUAGE DE 'IOM'
< ET 'IPM'...
JMP IDLSUP < FACILE ?!??!!
PAGE
<
<
< T A C H E D ' I D L E D E B A C K G R O U N D :
<
<
< FONCTION :
< CETTE TACHE EST LA MOINS PRIORITAIRE DU SYSTEME ;
< ELLE EST DESTINE A PRENDRE LE CONTROLE DE LA
< MACHINE LORSQUE TOUTES LES AUTRE TACHES SONT EN
< ATTENTE. COMME ON PEUT ESPERE QU'ELLES SONT EN
< ATTENTE D'INTERRUPTION (SINON ELLES SONT EN
< INTER-BLOCAGE), ON FAIT UN HALT QUI FAVORISE ENTRE
< AUTRE LES E/S DISQUES-ADM.
<
<
CALL #SISP CMS5 CHECK#
<
<
< ' D C T ' D E L ' I D L E :
<
<
CALL #SISP CMS5 DOL1#
DCTIDL: EQU $
PSTIDL: WORD DCTIDS;K;NSPINI;K;COM+DEPCS;NIL;XXIDLE;PILIDL;IDLINI;SMST
WORD MEMTV0;MEMTVE-Z < (SLO,SLE) ENCADRE 'MEMTV' POUR 'SVCM3'.
#@ASCI " IDL" < #SISP CMS5 ASCI#
<
< BALAYAGE PERIODIQUE DE LA MEMOIRE :
< (POUR EVITER DES PARITES ULTERIEURES)
<
BALAIS: WORD ZERO < ADRESSE COURANTE...
<
< MOT PERMETTANT DES TESTER
< LE PROCESSEUR MAITRE EN
< PERMANENCE :
<
WTEST: FLOAT DADR < CONVERTIE EN 'DADR'-MOTS...
XWOR%2: VAL -DADR
IF XWOR%1>XWOR%2-TBMEMQ,,XEIF%,
IF ATTENTION : C'EST PLUS SIMPLE SI LA LONGUEUR
IF EST UN MULTIPLE DE 'DADR' !!!
XEIF%: VAL ENDIF
BMEMQ: EQU $ < BUFFER DE COPIE...
DZS TBMEMQ
CALL #SISP CMS5 CHECK#
PAGE
USE L,DCT0
<
<
< I N I T I A L I S A T I O N D U S Y S T E M E :
<
<
IDLINI: EQU $
STA &ADCTSY < 'DCTIDS' REMPLACE 'DCTINI'
< DANS LA TABLE DES DCTSY ; EN
< EFFET L'ESPACE MEMOIRE OCCUPE PAR
< LE 'SYSINI' A ETE RECUPERE PAR
< L'ALLOCATION MEMOIRE, ET IL
< SERAIT FORT FACHEUX QUE L'ON Y
< RETOURNE (MEME PAR ERREUR) !!!
IF NSPINI-NSPIDS,,XEIF%,
IF ATTENTION : IL FAUT : NSPINI=NSPIDS !!!
XEIF%: VAL ENDIF
<
< PREPARATION DU DETECTEUR SECONDAIRE
< DE TIME-OUT :
<
XXIDL1:: VAL 16 < NOMBRE ARBITRAIRE DE BOUCLE D'IDLE
< AVANT DE TESTER LES TIME-OUT SECON-
< DAIRES...
LRM B
TOIDLE: WORD XXIDL1 < (B)=DECOMPTEUR DES BOUCLES D'IDLE.
LR B,Y < (Y)=POUR REINITIALISER 'B'...
LA HTIME+D < (A)=HEURE MEMORISEE TOUS LES 'XXIDL1'
< TOURS D'IDLE...
PSR A,B,Y < LA PILE MEMORISE 'A', 'B' ET 'Y'...
<
<
< B O U C L E D ' I D L E :
<
<
IDLE: EQU $
ARM NSNSP0+NSPIDS < EN FAIT INUTILE, MAIS ON NE SAIT
< JAMAIS !!!
BSR ASMIT < TEST DES INTERRUPTIONS ???
JAE IDLSY1 < OK, NON MASQUEES...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< NE SERAIT-CE PAS LA SUITE D'UN MASQUAGE
< AU PUPITRE DES INTERRUPTIONS DANS LA TACHE
< 'IDLE' PRECISEMENT ???
<
ACQ < PUIS, ON DEMASQUE...
IDLSY1: EQU $
<
< A PRIORI, MISE A JOUR PERMANENTE
< DU BOOTSTRAP 'DKM' :
<
LRM A,B,X
WORD TVDKMQ < (A)=ADRESSE DE LA TABLE DE VIRTUALISATION
< DE 'DKM',
WORD TVDKMR < (B)=ADRESSE DE LA TABLE DE VIRTUALISATION
< DU BOOTSTRAP 'DKM',
NTRN
WORD GAXCYL+NOCMO-E/NOCMO
TRN
< (X)=LONGUEUR EN MOTS...
MOVE < ET ON MET A JOUR, DES FOIS QUE...
<
< DETECTEUR SECONDAIRE DE TIME-OUT : CELUI-CI
< EST UTILISE LORSQUE PAR MALHEUR L'HORLOGE
< EST BLOQUEE : CELA PEUT ARRIVER, PAR EXEMPLE
< LORSQUE L'HORLOGE ADRESSE 'DKF' OU 'DKM',
< ET QUE CELUI-CI EST EN TIME-OUT : IL Y A
< INTER-BLOCAGE...
<
PLR A,B,Y < RESTAURE LES PARAMETRES...
ADRI -I,B < DECOMPTAGE DES TOURS...
CPZR B < FIN DES 'XXIDL1' TOURS ???
JNE IDLE1 < NON, ON ATTEND...
LR Y,B < OUI, ON REINITIALISE LE DECOMPTEUR.
CP HTIME+D < L'HEURE A-T'ELLE EVOLUE ???
LA HTIME+D < A PRIORI, (A)=HEURE COURANTE...
JNE IDLE1 < OUI, PAS DE TIME-OUT SUR L'HORLOGE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VERIFIER QUE C'EST BIEN UN INTERBLOCAGE !!!
<
PSR A,L
LXI NSPHOR < (X)='NSP' DE L'HORLOGE,
BSR ACADCT < (A)=L=ADRESSE DCT(HORLOGE).
BSR VAR+ASPTO < DETECTION ET TRAITEMENT DES TIME-OUT...
PLR A,L
IDLE1: EQU $
PSR A,B,Y < SAVE LES PARAMETRES 'A', 'B' ET 'Y'...
<
<
< T R A C E D U S Y S T E M E :
<
<
LXI K < POUR FAIRE UN 'HALT' MAXIMUM...
IDLE2: EQU $
LR W,L < (L)=-1 POUR AFFICHAGE PUPITRE
< DANS 'TRACE' A PRIORI...
LA &ASAESC
BSR ABETA < RENVOIE : (A)=BETA(SAESC)=NOMBRE DE 'DCT-
< ESCLAVE' LIBRES...
CPI NESCLA < Y-A-T'IL DES ESCLAVES CONNECTES ???
JL IDLEUS < OUI, AU MOINS 1...
<
<
< I D L E : P L U S D ' U T I L I S A T E U R :
<
<
<
< AUTORISATION DE LA COPY :
<
LA ETASYS
RBT OTOCOP < A PRIORI...
STA ETASYS
<
< AUTORISATION DE LA TRACE :
<
LA SAVEX
RBT XBTROF < A PRIORI...
STA SAVEX
<
< LORSQU'IL N'Y A PLUS PERSONNE
< DE CONNECTE, ON SE PLACE DANS
< UN MODE NON DANGEREUX ('DKU'
< NE DOIT PLUS SE SYNCHRONISER
< SUR LE SECTEUR 0 DE CHAQUE
< PISTE) :
<
LRM A,B
WORD IDLEBC < (A)=ADRESSE DE RETOUR DE 'PS0OFF',
WORD PS0OF3 < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE
< DE LA SYNCHRONISATION SUR LE
< SECTEUR 0 'OFF'.
PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR POUR
< SIMULER UN 'BSR', ET DE L'ADRESSE DU
< SOUS-PROGRAMME,
RSR < VERS LEQUEL ON VA EN METTANT (B) DANS
< 'P' PAR UN 'PSR'/'RSR'...
IDLEBC: EQU $ < ADRESSE DE RETOUR...
<
< LORSQU'IL N'Y A PLUS PERSONNE,
< ON REMET 'DKU' EN MODE 'FAST' :
<
LRM A,B
WORD IDLEBB < (A)=ADRESSE DE RETOUR DE 'PFAST',
WORD PFAST3 < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE
< EN MODE 'FAST' DE 'DKU'.
PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR POUR
< SIMULER UN 'BSR', ET DE L'ADRESSE DU
< SOUS-PROGRAMME,
RSR < VERS LEQUEL ON VA EN METTANT (B) DANS
< 'P' PAR UN 'PSR'/'RSR'...
IDLEBB: EQU $ < ADRESSE DE RETOUR...
<
< CAS OU IL N'Y A PLUS PERSONNE
< DE CONNECTE : ACTIVONS LA
< COMPRESSION 'SGN' A PRIORI :
<
LRM A,B
WORD IDLEBA < (A)=ADRESSE DE RETOUR DE 'PSGNON',
WORD PSGNON < (B)=ADRESSE DU SOUS-PROGRAMME D'ACTIVA-
< TION DE LA COMPRESSION.
PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR (SIMU-
< LANT UN 'BSR'), ET DE L'ADRESSE DU SOUS-
< PROGRAMME,
RSR < POUR SE BRANCHER A 'PSGNON'...
IDLEBA: EQU $ < ADRESSE DE RETOUR...
<
< TEST DES FICHIERS ENCORE OUVERTS :
<
XWOR%1: VAL COSBT?XBITF1=FMASK(K=FCINST>NBITEF
XWOR%1: VAL COSBT?XBITF1=FMASK(K?XWOR%1=FCINST
LAI XWOR%1 < AFIN DE COMPTER LE NOMBRE DE FICHIERS
SBT XXBKFE < A L'ETAT "OPEN"...
BSR ALOOKF < (A)=NOMBRE DE FICHIERS OUVERTS OU
< BIEN EN ATTENTE DE DELETE...
JANE IDLEUS < ENCORE AU MOINS OUVERT, OU EN ATTENTE
< DE DELETE, ON ATTEND DONC...
PSR X,L
LXI NSPHOR < NON, PERSONNE...
BSR ACADCT < (L)=ADRESSE DCT(HORLOGE),
LA VAR+PATCOP < (A)=PATTERN CYCLIQUE DES COPIES,
PLR X,L
LR A,L < (L)=PATTERN DES COPIES S'IL N'Y A
< PAS D'UTILISATEURS CONNECTES...
<
<
< T E S T D U F O N C T I O N N E M E N T :
<
<
IDLEUS: EQU $
CALL #SISP CMS5 RST#
TBT MAINT < LE BIT 'MAINT' EST-IL PRESENT ???
LA MEMV < AFIN DE TRACER 'MEMV'...
< (ON NE SAIT JAMAIS...)
JC IDLEXY < OUI, ON VA L'INDIQUER AU PUPITRE...
TBT MEMXXX < TOUT EST-IL AUTORISE ???
JC IDLEXY < OUI, ON LE SIGNALE AU PUPITRE...
PSR A,W < NON, ALORS :
LRM A,W
LAI XXCPR < (A)=INSTRUCTION VARIABLE D'AUTORISA-
< TION/INHIBITION DE LA COMPRESSION,
WORD DCOMPR < (W)=SON ADRESSE...
CP O,W < ALORS LE 'STN' DU 'SGN' PEUT-IL FAIRE
< DE LA COMPRESSION ???
PLR A,W < RESTAURE : (A)='MEMV' POUR TRACE...
JE IDLEXX < OUI, 'L' RESTE TEL QUEL...
<
< CAS DES FONCTIONNEMENTS DANGEREUX
< DU FABULEUX SYSTEME 'CMS5' :
<
IDLEXY: EQU $
LBI MOCD < OUI, ON L'INDIQUE AU PUPITRE EN
< INVERSANT L'OCTET DROIT !!!
EORR B,L < ON INVERSE PARTIELLEMENT LE PUPITRE
< DANS 2 CAS :
< 1 - BIT 'MAINT' DE 'ST' PRESENT,
< 2 - BIT 'MEMXXX' DE 'MEMV' PRESENT,
< 3 - PAS DE COMPRESSION DES ITEMS AU
< NIVEAU 'STN' DU 'SGN'.
IDLEXX: EQU $
BSR ATRACE < TRACE, ET AFFICHAGE AU PUPITRE DE
< 'XXIDLE' SI AU MOINS UN UTILISATEUR
< EST CONNECTE, ET DE LA PATTERN PERIODI-
< QUE DES COPIES ; ANSI, ON PEUT SAVOIR
< EN REGARDANT LE PUPITRE S'IL EST
< POSSIBLE DE RECHARGER LE SYSTEME,
< C'EST-A-DIRE, S'IL N'Y A PAS D'UTILI-
< SATEURS CONNECTES, ET SI SURTOUT, LE
< LE SYSTEME A FAIT AU MOINS LES 2
< DERNIERES COPIES EN BASCULE...
<
<
< A T T E N T E :
<
<
HALT < ATTENTE MOMENTANEE DES INTERRUPTIONS...
<
<
< T R A I T E M E N T D E L A S Y N C H R O N I S A T I O N
< S U R L E M O T ' C D A G 0 ' :
<
<
BLOCK2: EQU $ < ADRESSE DE BLOCAGE LORS DE LA RELANCE
< SUITE A UN DEFAUT SECTEUR NON PRIS EN
< COMPTE...
PSR X,Y,W
SVC SVCM9 < VERS LA SYNCHRONISATION SUR LES VALEURS
< POSITIVES DE 'CDAG0'...
<
<
< B A L A Y A G E P E R I O D I Q U E
< D E L A M E M O I R E :
<
<
LRM W
WORD BALAIS < (W)=ADRESSE DE L'ADRESSE COURANTE DANS LA
< MEMOIRE LORSQU'ON LA BALAYE...
LA O,W < (A)=ADRESSE DU MOT COURANT,
IC O,W < QUE L'ON FAIT PROGRESSER...
LR A,W < (W)=ADRESSE DU MOT COURANT :
LA O,W < ACCES AU MOT COURANT (ON NE FAIT QUE LE
< LIRE, BIEN SUR ; S'IL Y A UNE PARITE ON
< FERA AINSI UNE ALARME SANS TROP DE
< RISQUES...).
NLS
GABUZO: EQU $
NOP
LST
<
<
< T E S T P E R I O D I Q U E D U P R O C E S S E U R
< M A I T R E :
<
<
JMP TESTPM < LE MODULE CORRESPONDANT NE PEUT ETRE
< IMPLANTE ICI POUR DES RAISONS BIEN
< CONNUES...
< A NOTER :
< (A)=BALAIS COURANT...
TESTRT: EQU $ < RETOUR DU TEST DU PROCESSEUR...
<
<
< S I M U L A T I O N D ' U N S Y S T E M E
< D E T E L E V I S I O N N U M E R I Q U E
< A C C E D A N T A T O U T E L A
< M E M O I R E D U S Y S T E M E :
<
<
SVC SVCM3 < APPEL DU 'SVC' MAITRE ADEQUAT...
< ((SLO,SLE) ENCADRE 'MEMTV'...)
PLR X,Y,W
CPZR X < FIN DU 'HALT' ???
JNE IDLE2 < NON, ON REBOUCLE, AFIN DE MODERER LE
< RYTHME DES TESTS SECONDAIRES DE
< TIME OUT...
<
<
< A C T I O N S U R L A R E G U L A T I O N
< D U S W A P P I N G E S C L A V E :
<
<
STZ SOCYCL < RAZ DE LA LISTE CYCLIQUE DES
< ESCLAVES A SWAPPER OUT A PRIORI ;
< ON CREE AINSI UNE BOUCLE DE
< REGULATION AVEC LE SWAPPER
< OUT : SI LE TAUX DE SWAPPING
< OUT AUGMENTE (ET DONC AUSSI
< LE SWAPPING IN), LE NBRE
< D'E/S DISQUES AUGMENTE, ET
< DONC CERTAINEMENT AUSSI LE
< NBRE DE PASSAGE EN IDLE ; EN
< IDLE, RAZANT 'SOCYCL' , ON
< DIMINUE LE TAUX DE SWAPPING
< OUT, ET DONC LE NBRE D'E/S
< DISQUES, ET DONC LE NBRE DE
< PASSAGE EN IDLE, ET DONC
< SOCYCL REDEVIENT NON NUL,...
< (ET ON RESWAPPE OUT...)
<
<
< T E S T D E T R A S H I N G D U S Y S T E M E :
<
<
LXI NSPDKF < (X)=NSP DISQUE DE SWAPPING
BSR ACADCT < (L)=@DCT DU DISQUE DE SWAPPING.
BSR APBS < TEST DE LA FILE D'ATTENTE
< SUR LE DISQUE DE SWAPPING.
JLE IDLE < OK,LA FILE D'ATTENTE EST
< ACCEPTABLESUR LE DISQUE
< DE SWAPPING
<
< CAS OU IL Y A TROP DE MONDE
< SUR LE DISQUE DE SWAPPING :
<
LXI NSPSCH
BSR ACADCT < (L)=@DCT-SCH.
BSR APBS < TEST DE LA FILE D'ATTENTE SUR
< LE SCHEDULER.
LA &FREQI < (A)=FREQUENCE COURANTE DE L'HORLOGE.
JGE IDLE < TOUT PARAIT OK, POUR LE MOMENT.
<
<
< T R A S H I N G A P P A R E N T :
<
<
< DANS LE CAS SUIVANT :
<
< 'BETA(DKS) GRAND' & 'BETA(SCHEDULER) PETIT',
< IL Y A INSTABILITE DU SYSTEME. LA SOLUTION EST DE TENTER
< DE STABILISER LE SYSTEME EN JOUANT SUR LA FREQUENCE
< DE L'HORLOGE.RAPPELONS QUE L'ON DISPOSE DE
< 4 FREQUENCES UTILISABLES:
< F1:BIT6 1 SECONDE ('03E8 MILLISECONDES)
< F2:BIT7 0,5 SECONDE ('01F4 MILLISECONDES)
< F3:BIT8 0,200 SECONDE ('00C8 MILLISECONDES)
< F4:BIT9 0,100 SECONDE ('0064 MILLISECONDES)
<
< ON REMARQUERA HABILEMENT QUE 200 MS LAISSENT LE TEMPS
< (LE NUMERO DE BIT INDIQUE LE NUMERO DU 1ER BIT
< A 1 DANS LA VALEUR DE CES FREQUENCES, ET TESTE PAR
< LE HANDLER HORLOGE). EXPERIMENTALEMENT, ON CONSTATE
< LES FAITS SUIVANTS (SUBJECTIFS...) :
< SI LA FREQUENCE EST 'PETITE', IL FAUT
< L'AUGMENTER,
< SI LA 'FREQUENCE' EST GRANDE, IL VAUT MIEUX
< LA DIMINUER.
<
<
< ON A ICI :
< (A)=FREQUENCE COURANTE.
<
<
DBT < EVALUATION DE LA FREQUENCE
< COURANTE DE L'HORLOGE.
XWOR%8: VAL CODBT=FMASK(K?XH200=FCINST)XH200
ADRI -XWOR%8,X < FORMONS :
< FREQUENCE - F3 DE FACON A
< CALCULER UN INCREMENT/DECREMENT
< A LA FREQUENCE COURANTE:
< SI F=F1 DELTA(F)= -2
< SI F=F2 DELTA(F)= -1
< SI F=F3 DELTA(F)= 0
< SI F=F4 DELTA(F)= 1
< (X)=DELTA(F)...
ADR X,A < INCREMENTATION/DECREMENTATION
< DE LA FREQUENCE COURANTE.
STA &FREQI < MAJ DE LA FREQUENCE COURANTE,
< AFIN QUE HDLHOR LA MODIFIE.
JMP IDLE < ET ON BOUCLE SUR L'IDLE...
<
<
< REMARQUE IMPORTANTE :
< ON NE TESTE PAS LES FILES D'ATTENTE SUR
< L'AUTRE DISQUE.EN EFFET,LA LONGUEUR DE CELLE-CI
< DEPEND DE L'ACTIVITE
< DES ESCLAVES ; MAIS CETTE ACTIVITE
< DEPEND DE LEUR REACTIVATION (...),
< QUI ELLE-MEME DEPEND DES FINS DE SERVICE,
< ET DONC ENTRE AUTRE DES FINS D'E/S
< DISQUE.
< IL EXISTE DONC AINSI DANS LE SYSTEME
< UNE BOUCLE D'AUTO-REGULATION...
<
<
< AUTRE REMARQUE:
< ON REMARQUERA HABILEMENT QUE TOUTES LES
< FREQUENCES F1 A F4 SONT UTILISABLES,PUISQUE
< LA PLUS GRANDE F4 (PERIODE =100MS)LAISSE LE
< TEMPS DE FAIRE UN ECHANGE DISQUE MEME AMOVIBLE
<
<
PAGE
<
<
< T E S T P E R I O D I Q U E D U P R O C E S S E U R
< M A I T R E :
<
<
< FONCTION :
< CE MODULE TOURNE DONC PENDANT
< L'IDLE ; IL PART D'UN NOMBRE
< "PSEUDO-ALEATOIRE" (L'HEURE DANS
< LE JOUR EXPRIMEE EN SECONDES
< .EOR. LE BALAIS COURANT, ET
< TRONQUEE, AFIN D'EVITER DES DEBOR-
< DEMENTS) ; ENSUITE, IL EFFECTUE
< DESSUS UNE SUITE D'OPERATIONS
< ARITHMETIQUES ET LOGIQUES, PUIS
< LA SEQUENCE INVERSE ; ENFIN, IL
< VERIFIE QU'IL RETOMBE BIEN SUR
< SES PIEDS.
< AINSI, SI LES OPERATEURS CABLES
< ET MICRO-PROGRAMMES ONT DES PRO-
< BLEMES DELICATS ET ALEATOIRES, ON
< PEUT ESPERER LES PIEGER ICI...
<
<
KTEST0:: VAL '10 < POUR EVITER LES PASSAGES PAR 0...
KTEST1:: VAL '53 < CONSTANTE ARBITRAIRE POUR TESTER LES
< ADDITIONS IMMEDIATES...
KTEST2:: VAL 'D6 < CONSTANTE ARBITRAIRE POUR TESTER LES
< OPERATIONS LOGIQUES IMMEDIATES...
KTEST3:: VAL NBITMO/XXXMOY < NUMERO D'UN BIT PRESQUE ARBITRAIRE DANS
< UN MOT...
KTEST4:: VAL -'47 < POUR TESTER QUE LES INSTRUCTIONS FLOT-
< TANTES NE SONT PAS PRISES POUR DES
< INSTRUCTIONS 'SVC' D'EXTENSION...
<
< POINT D'ENTREE :
<
TESTPM: EQU $
LRM W
WORD WTEST < (W) VA BASER LA VARIABLE ALEATOIRE...
<
< INITIALISATION DU PROCESSUS
< DE TEST ENTIERS/LOGIQUES :
<
EOR HTIMED < (A)=HEURE DU JOUR TRONQUEE EN SECONDES,
< .EOR. LE BALAIS COURANT (CONTENU
< DANS LE 'A' INCIDENT.
RBT BITSIG < ET CECI AFIN D'EVITER DES OVERFLOWS
RBT BITSIG+BIT < LORS DES OPERATIONS ARITHMETIQUES...
JANE TEST01 < OK, NON NUL...
LAI KTEST0 < POUR EVITER LES PASSAGES PAR 0...
< (ET SURTOUT LES DIVISIONS PAR 0)
TEST01: EQU $
JAG TEST04 < OK, LE NOMBRE ALEATOIRE EST CORRECT...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE :
< EXAMINER LE COMPORTEMENT DE
< L'OPERATEUR LOGIQUE !!!
<
TEST04: EQU $
LR A,Y < (Y)=NOMBRE ALEATOIRE COURANT,
STA O,W < QUE L'ON MET AUSSI DANS 'WTEST', AFIN
< DE TESTER ET LES OPERATIONS REGISTRE
< A REGISTRE, ET REGISTRE A MEMOIRE...
<
< SERIE DE TRANSFORMATIONS ENTIERES/LOGIQUES :
<
SCRS NBITMO < OPERATION THEORIQUEMENT NEUTRE...
IBT KTEST3 < POUR TESTER LES OPERATIONS SUR BITS...
EORI KTEST2 < POUR TESTER LES OPERATIONS LOGIQUES...
ADR Y,A < POUR TESTER LES ADDITIONS REGISTRE
< A REGISTRE,
AD O,W < ET MEMOIRE A REGISTRE...
ADRI KTEST1,A < POUR TESTER LES ADDITIONS IMMEDIATES...
SCY < ON FORCE LE 'CARRY',
ADCR A < ET ON L'AJOUTE A (A)...
MP O,W < POUR TESTER LA MULTIPLICATION...
<
< SERIE INVERSE ENTIERES/LOGIQUES :
<
DV O,W < POUR TESTER LA DIVISION,
JNCV TEST05 < OK, ELLE S'EST BIEN PASSEE...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< VERIFIER LES ARGUMENTS DE
< LA DIVISION AVANT D'ACCUSER
< LA MACHINE...
<
TEST05: EQU $
SCY
SBCR A
ADRI -KTEST1,A
SB O,W
SBR Y,A
EORI KTEST2
IBT KTEST3
SCLS NBITMO
<
< VERIFICATION DES RESULTATS :
<
CP O,W < EST-ON RETOMBE SUR SES PIEDS ???
JE TEST02 < OUI...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< VERIFIER LE CODE D'AUTO-TEST
< PRECEDENT AVANT DE TELEPHONER
< A LA MAINTENANCE !!!
<
TEST02: EQU $
EORR Y,A < (A) ET (Y) DOIVENT ETRE IDENTIQUES, LE
< RESULTAT DE CETTE OPERATION DOIT DONC
< ETRE NUL..
ORR B,A < DE PLUS LA DIVISION PRECEDENTE A DU
< TOMBER JUSTE, DONC LE 'A' FINAL DOIT
< ETRE STRICTEMENT NUL...
JAE TEST03 < ET OUI, TOUT EST BON...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< MEME REMARQUE !!!
<
TEST03: EQU $
<
< INITIALISATION DU PROCESSUS FLOTTANT :
<
PSR C < ET OUI, MALHEUREUSEMENT, A CAUSE DU
< BLOC FLOTTANT, IL EST PLUS PRUDENT
< DE CHANGER DE BASE 'C'...
LRM C
WORD CTESTC+DEPCS < ON PREND COMME COMMON, UN MOT BIDON...
< A T T E N T I O N : IL N'EST PLUS
< POSSIBLE DE FAIRE DE 'SYSER' JUSQU'A
< LA RESTAURATION DE 'C' !!!
STZ CTESTC-CTESTC-DEPCS,C
< ET ON LE CLEAR AVANT TOUTE OPERATION
< FLOTTANTE, AFIN DE POUVOIR LE TESTER A
< LA FIN...
LXI KTEST4 < ON INITIALISE 'X' AFIN DE VERIFIER QUE
< LES INSTRUCTIONS FLOTTANTES SUIVANTES
< NE SONT PAS, SUITE A UN DEFAUT HARD,
< CONSIDEREES COMME DES 'SVC' EXTENSION...
LR Y,A < (A)=(Y)=NOMBRE ALEATOIRE,
FLT < QUE L'ON FLOTTE,
FST O,W < ET RANGE EN MEMOIRE...
<
< SERIE DE TRANSFORMATIONS FLOTTANTES :
<
FNEG
FAD O,W
FMP O,W
<
< SERIE INVERSE FLOTTANTE :
<
FDV O,W
FSB O,W
FNEG
<
< VERIFICATIONS DES RESULTATS :
< (NOTA : ON NE PEUT FAIRE LE
< 'FCAM O,W', CAR EN EFFET, EN
< CAS DE TEST NEGATIF, IL FAU-
< DRAIT FAIRE UNE 'SYSER', OR
< LA BASE 'C' EST MAUVAISE, ET
< CELA ALLOURDIRAIT LA PROGRAM-
< MATION ; DE PLUS, ON FAIT PLUS
< LOIN UN 'CPR A,Y'...)
<
FIX
CPZ CTESTC-CTESTC-DEPCS,C
< ALORS, COMMENT SE SONT PASSEES TOUTES
< LES OPERATIONS FLOTTANTES PRECEDENTES ;
< ON NOTERA POUR 'CTESTC' :
< BIT0 : 'UNDERFLOW',
< BIT1 : 'OVERFLOW',
< BIT2 : DIVISION PAR 0,
< BIT3 : 'FIX' IMPOSSIBLE...
PLR C < ET RESTAURATION DE LA BASE 'C' DE 'CMS5'.
JE TEST09 < OK, LE RESULTAT N'EST PAS TROP GRAND...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< MEME REMARQUE !!!
<
TEST09: EQU $
CPR A,Y < EST-ON RETOMBE SUR NOS PIEDS ENTIERS ???
JE TEST07 < OUI...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< MEME REMARQUE !!!
<
TEST07: EQU $
LR X,A
CPI KTEST4 < ALORS N'Y A-T'IL PAS EU DE 'SVC'
< D'EXTENSION FLOTTANTE...
JE TEST08 < NON...
BSR ASYSER < E R R E U R M A C H I N E ...
<
< QUE FAIRE ???
< VERIFIER D'ABORD LA PRESENCE
< DU BLOC FLOTTANT, ET PUIS COMPREN-
< DRE COMMENT LES TESTS PRECEDENTS
< PURENT ETRE POSITIFS !!!
<
TEST08: EQU $
<
<
< C O P I E D ' U N E Z O N E Q U E L C O N Q U E
< D E L A M E M O I R E E N M E M O I R E B A S S E :
<
<
< FONCTION :
< CE MODULE A ETE RAJOUTE
< AFIN DE VISUALISER INDIREC-
< TEMENT PAR "!ACTIVITE..."
< L'ENSEMBLE DE LA MEMOIRE...
< LA COPIE EST FAITE TELLE
< QUE :
<
< BMEMQ <-- (AMEMQ).
<
<
CALL #SISP CMS5 PSRSLO#
LRM A
AMEMQ: WORD O>DADR < (A)=DADR-ADRESSE DU PREMIER MOT DE LA
< ZONE DE MEMOIRE QUELCONQUE A VISUA-
< LISER.
< (A)=FUTUR 'SLO',
LR A,B < AFIN DE CALCULER UN 'SLE' :
ADRI TBMEMQ>DADR-Z,B < (B)='SLE' DE FACON QUE (SLO,SLE) ENCADRE
< EXACTEMENT LA ZONE A COPIER...
WOE < ENCADREMENT DE LA MEMOIRE...
LRM A,B,X
WORD O < (A)=ADRESSE DE DEBUT RELATIVE A 'SLO'
< DE L'EMETTEUR,
WORD BMEMQ < (B)=ADRESSE DU RECEPTEUR,
WORD TBMEMQ < (X)=NOMBRE DE MOTS A DEPLACER...
MVTM < ET COPIE EN MEMOIRE BASSE D'UNE ZONE
< QUELCONQUE DE LA MEMOIRE...
CALL #SISP CMS5 PLRSLO#
<
<
< G E S T I O N D U R E G I S T R E ' I M ' :
<
<
LRM W
WORD RIMMST < (W)=ADRESSE DE LA COPIE EN MEMOIRE DEBA-
< NALISEE DU REGISTRE 'IM' DU PROCES-
< SEUR MAITRE,
LA O,W < (A)=VALEUR A DONNER A 'IM'...
XIMR A < ET ON MET A JOUR AINSI PERIODIQUEMENT
< LE REGISTRE 'IM', QUI PEUT DONC ETRE
< MODIFIE INTERACTIVEMENT PAR LE 'DEBUG
< ABSOLU', VIA LE MOT 'RIMMST'...
<
<
< V E R I F I C A T I O N D E S C H E C K - S U M S
< D E S B L O C S " R O M " - " R A M " :
<
<
< FONCTION :
< CE MODULE PERMET DE SIMULER
< DES BLOCS DE MEMOIRE "ROM" ;
< EN EFFET, ON VERIFIE EN PERMA-
< NENCE SI CERTAINES ZONES MEMOIRE
< DONT LE CONTENU NE PEUT CHANGER,
< NE CHANGE QUAND MEME PAS, ET CECI
< PAR 2 CAUSES PRINCIPALES :
< 1 - LA MALVEILLANCE (AU PUPITRE...),
< 2 - LES ERREURS DANS LE SYSTEME...
<
<
FRCHEC:: VAL 4 < LOGARITHME EN BASE 2 DE LA FREQUENCE DES
< TESTS "ROM"/"RAM" EXPRIMEE EN UNITE
< 2*65535 MICRO-SECONDES...
LRM W
WORD BALAIS < (W)=ADRESSE DU "BALAIS", DONT LA VALEUR
< EST INCREMENTEE APRES CHAQUE 'HALT',
< DONC AVEC LA PERIODE ANNONCEE...
LAI K < CLEAR 'A',
LB O,W < (B)=VALEUR COURANTE DU "BALAIS"...
AFRCHK: SCRD FRCHEC < ET ON DIVISE LE "BALAIS" POUR SAVOIR
< S'IL EST DIVISIBLE PAR 2**FRCHEC...
JANE CHEK04 < ET BIEN NON, IL N'EST PAS DIVISIBLE,
< DONC ON NE FAIT PAS LE TEST "ROM"/"RAM",
< FAVORISANT AINSI :
< 1 - LA STABILITE DU DISPLAY AU PUPITRE
< DE L'"IDLE",
< 2 - L'EXECUTION DES COMMANDES DU TYPE
< "!ACTIVITE R/V/B...".
LRM W < OUI, ALLONS VERIFIER...
WORD CHAIN2 < (W)=ADRESSE DE DEBUT DE LA CHAINE
< DES BLOCS.
<
< PARCOURS DE LA
< CHAINE DES BLOCS :
<
CHEK01: EQU $
<
< CALCUL DU CHECK-SUM
< DU BLOC COURANT :
<
LAI K < (A)=CUMUL DE CALCUL DES CHECK-SUMS,
LB CHAINA,W < (B)=ADRESSE DU BLOC PRECEDENT, CE QUI DON
< LE TEST DE FIN DE CALCUL DU CHECK-
< SUM DU BLOC COURANT,
LX CHAINX,W < (X)=VALEUR ATTENDUE DU CHECK-SUM.
CHEK02: EQU $
EOR O,W < CUMUL DU CHECK-SUM,
ADRI -D,W < PASSAGE AU MOT PRECEDENT,
CPR B,W < S'IL EXISTE ???
JNE CHEK02 < OUI...
CPR A,X < NON, ALORS LE CHECK-SUM EST-IL BON ???
JE CHEK03 < OUI, OK...
CHEKPA: BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< IL CONVIENT D'ABORD DE
< REPERER LE BLOC EN CAUSE,
< ET VERIFIER QU'IL N'Y A
< PAS REELLEMENT D'INFORMA-
< TIONS VARIABLES OUBLIEES
< LORS DE L'IMPLANTATION DES
< #SISP CMS5 CHECK# ; SI CE
< N'EST PAS LE CAS, ALORS ?!??!
<
CHEK03: EQU $
LA CHAINA,W < (A)=ADRESSE DU BLOC "ROM" PRECEDENT, CAR
< ON SAUTE LE BLOC "RAM"...
LR A,W < AFIN DE L'ACCEDER AU TOUR SUIVANT...
CP INFINI < EST-CE LA FIN DE LA CHAINE DES BLOCS ???
JNE CHEK01 < NON, AU BLOC PRECEDENT...
<
< RETOUR A L'IDLE :
<
CHEK04: EQU $
LRM A
WORD TESTRT < (A)=ADRESSE DE RETOUR DES TESTS...
PSR A < ET ON SIMULE
RSR < UN 'GOTO''TESTRT'...
PAGE
<
<
< G E S T I O N D E S R E G I S T R E S ' H D C ' :
<
<
< FONCTION :
< IL N'Y A PAS MALHEUREUSEMENT AUTANT
< DE JEUX DE REGISTRES 'HDC' QU'IL Y
< A DE PERIPHERIQUES DE CE TYPE ;
< IL FAUT DONC UNE STRATEGIE D'ALLO-
< CATION :
< 1 - ON DISPOSE D'UN POOL MEMORISE
< DANS LA PILE 'PILDKX' (PLEINE A
< L'INITIALISATION DU SYSTEME) ;
< 2 - 'DKM' ET 'DKU' FONT DES 'GET'
< SUR CE POOL QUAND ILS ONT BESOIN
< D'UN JEU, ET DES 'REL' LORSQU'ILS
< ONT FINI (A LA SORTIE DES HANDLERS) ;
< 3 - 'DKF' OBEIT AU MEME PRINCIPE A
< LA DIFFERENCE PRES SUIVANTE : A LA
< SORTIE DE SON HANDLER, SUIVANT LA
< VALEUR DE L'INDICATEUR BRCDKF(ETASYS),
< IL PEUT GARDER SON JEU DE REGISTRES
< AUSSI LONGTEMPS QUE CET INDICATEUR
< L'Y AUTORISE, AINSI 'DKF' SERA MOINS
< RALENTI...
<
<
RHDC0:: VAL K < NUMERO DU PREMIER JEU.
<
<
< S E M A P H O R E D ' A L L O C A T I O N :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
SEMDKX: WORD NRHDC < PROTEGE L'ACCES AU 'NRHDC' JEUX...
DZS LSEM
SEMDKY: EQU SEMDKX < A CAUSE DE
SEMDKZ: EQU SEMDKX < L'ASSEMBLEUR...
CALL #SISP CMS5 DOL2#
<
<
< P O O L D E J E U X D E R E G I S T R E S :
<
<
PILDKX: BYTE NRHDC;NRHDC < LA PILE EST PLEINE A L'INITIALISATION
< DU SYSTEME : TOUS LES REGISTRES SONT
< LIBRES.
XWOR%1: VAL CCBCCN=K
DO NRHDC
WORD RHDC0=FCDO>XWOR%1 < NUMERO D'UN JEU LIBRE POSITIONNE...
<
<
< C O N S T A N T E S D I V E R S E S :
<
<
XXDK4:: VAL 128 < NOMBRE DE TENTATIVES AUTORISEES SUR UN
< ECHANGE EN ERREUR.
PAGE
<
<
< D C T D K F :
<
<
CALL #SISP CMS5 DOL1#
DCTDKF: EQU $
PSTDKF: WORD K;K;K;K;COM+DEPCS;DCTDKF;NIL;PILDKF;HANDLR;SMST;SO;SE
#@ASCI " DKF" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XXDCTP < ETALOC=XXDCTP : 'DKF' NON LOUABLE...
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'DKF',
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'DKF'.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLDKF < ROUTINE SPECIFIQUE D'EXECUTION DES
< ENTREES-SORTIES SUR 'DKF'.
WORD ITDKF < ROUTINE SPECIFIQUE DE TRAITEMENT
< DES INTERRUPTIONS SUR 'DKF'.
WORD K;K < ETAT.
WORD COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
WORD XXDK4;TRYDKF < NTRIES ET FRTRY.
WORD K < HSTATS.
XWOR%2: VAL 2
WORD XWOR%2*DKCMS4 < TESTO#0 : TIME-OUT A TESTER...
XWOR%1: VAL K
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < LISTE DES FONCTIONS AUTORISEES.
XWOR%1: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARDKF: EQU $
IF VARDKF-DCTDKF-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACDKF?FPHCME
SADKF:: VAL $-D-VARDKF < SORTIE ADRESSE SECTEUR.
WORD ACDKF?FPHSAD
CSDKF:: VAL $-D-VARDKF < SORTIE COMPTE DE SECTEURS.
WORD ACDKF?FPHCMD
CDDKF:: VAL $-D-VARDKF < SORTIE COMMANDE.
WORD ACDKF?FPHETA
EADKF:: VAL $-D-VARDKF < ENTREE MOT D'ETAT A.
WORD ACDKF?FPHETB
EBDKF:: VAL $-D-VARDKF < ENTREE MOT D'ETAT B.
WORD ACDKF
INIDKF:: VAL $-D-VARDKF < POUR INITIALISER LE CCB.
<
< 'CCB' DU DISQUE 'DKF' :
<
WORD K
CCDKG0:: VAL $-D-VARDKF < POUR INITIALISER 'CCDKF0',
WORD K
CCDKG2:: VAL $-D-VARDKF < DE MEME POUR 'CCDKF2'...
CCDKF:: VAL $-VARDKF < 'CCBDKF' :
WORD K
CCDKF0:: VAL $-D-VARDKF < MOT 0 DU 'CCB'.
BYTE CCBHDC?XSNDKF;K
CCDKF1:: VAL $-D-VARDKF < MOT 1 DU 'CCB', DONT LE FORMAT EST :
< BITS 0-1 : MODE 'HDC',
< BITS 2-7 : SOUS-NIVEAU NORMAL,
< BITS 11-15 : NUMERO DU JEU DE REGISTRES
< 'HDC' UTILISE.
WORD NIL
CCDKF2:: VAL $-D-VARDKF < MOT 2 : ADRESSE-MOT DU BUFFER EN
< MEMOIRE (POIDS FAIBLES).
WORD NILK
CCDKF3:: VAL $-D-VARDKF < MOT 3 : LONGUEUR-MOTS DU BUFFER.
WORD ACDKF
CCDKF4:: VAL $-D-VARDKF < MOT 4 : OPERANDE DE LA 'SIO' D'ECHANGE :
< BITS13-15=000 : LECTURE,
< BITS13-15=001 : ECRITURE.
<
< ACCES AU REGISTRES 'HDC' :
<
XXNHDC:: VAL K < ETAT DE NON ALLOCATION DE REGISTRES 'HDC'
IF XXNHDC-K,,XEIF%,
IF ATTENTION : LES TESTS D'APPROPRIATION DE
IF REGISTRES 'HDC' PAR 'CPZ' VONT MERDER !!!
XEIF%: VAL ENDIF
WORD XXNHDC
XRHDCF:: VAL $-D-VARDKF < INDICATEUR DE L'ETAT D'ALLOCATION :
< 0 : 'DKF' N'A PAS DE JEU DE REGISTRES,
< 1 : 'DKF' EN A UN, SOIT PARCEQU'IL
< EST EN TRAIN DE L'UTILISER, SOIT
< PARCEQU'IL EST AUTORISE A LE
< CONSERVER EN PERMANENCE...
<
< INFORMATIONS DE "DIMENSIONNEMENT" :
<
WORD NSDKF
NOSDKF:: VAL $-D-VARDKF < NOMBRE DE SECTEURS SUR 'DKF'.
<*******************************************************************************
WORD '4000
XWOR%1: VAL '0000000@@@@ < NOMBRE DE MOTS MAX ECHANGES.
<*******************************************************************************
NTRN
IF XWOR%1/LK(K=FCREST,,XEIF%,
IF ATTENTION : LE NOMBRE DE MOTS MAX ECHANGEABLES
IF DOIT ETRE UN NOMBRE ENTIER DE K-MOTS !!!
XEIF%: VAL ENDIF
TRN
XX16KK:: VAL XWOR%1/LK < NOMBRE DE 'K' MAX ECHANGEABLE...
NMMDKF:: VAL $-D-VARDKF < NOMBRE DE MOTS MAX ECHANGES.
<
< VIRTUALISATION DU BAS DE 'DKF' :
<
WORD TVDKF,X
ATVDKF:: VAL $-D-VARDKF < ACCES A LA TABLE DE VIRTUALISATION...
WORD ZERBV
AVDKF:: VAL $-D-VARDKF < ADRESSE DU PREMIER SECTEUR VIRTUALISE.
< (A UNE FRONTIERE DE PISTE)
WORD ZERBNV
ANVDKF:: VAL $-D-VARDKF < ADRESSE DU PREMIER SECTEUR NON VIRTUA-
< LISE (A UNE FRONTIERE DE PISTE).
<
< BLOC DE DEMANDE DE SIMULATION DE 'DKF' SUR 'DKM' :
<
DEMFM:: VAL $-VARDKF
DZS LDEM0B < ON MET UNE 'BOX', ON NE SAIT JAMAIS...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILDKF: EQU $-DEPILE < PILE DKF
XWPILE: VAL LPILEH+6
CALL #SISP CMS5 GENPIL2#
PAGE
<
<
< T A B L E D E V I R T U A L I S A T I O N
< D U D E B U T D E ' D K F ' :
<
<
CALL #SISP CMS5 DOL1#
NTRN
IF ZERBV/XNSPDK(K=FCREST-K,,XEIF%,
IF ATTENTION : 'ZERBV' EST MAL IMPLANTEE !!!
XEIF%: VAL ENDIF
TRN
<
<
< FONCTION :
< LE DEBUT DU DISQUE DE 'ZERBV' A 'ZERBNV'
< EXCLU N'EST ACCEDE QUE SECTEUR PAR SECTEUR ;
< IL EST OCCUPE PAR 'TOGB', 'TP' ET L'ARBRE DU
< SYSTEME ; ON PEUT LE VIRTUALISER PISTE A PISTE
< PUISQU'UUCUN ECHANGE NE RISQUE DE CHEVAUCHER
< 2 PISTES. AINSI, UTILISANT LES PISTES INUTILISEES,
< ON DISPOSE DE PISTES DE RESERVE DES PISTES VIRTUA-
< LISEES EN DEFAUT...
<
<
NTRN
IF ZERBNV/XNSPDK(K=FCREST-K,,XEIF%,
IF ATTENTION : 'ZERBNV' N'EST PAS A UNE FRONTIERE DE PISTE...
XEIF%: VAL ENDIF
TRN
IF NOCMO-Z-I,,XEIF%,
IF ???!??!?
XEIF%: VAL ENDIF
TVDKF: EQU $-ZERBVP < DEBUT DE LA TABLE DE VIRTUALISATION.
NTRN
XWOR%1: VAL NPVDKF+NOCMO-E/NOCMO
XWOR%2: VAL NPVDKF/NOCMO(K=FCREST
TRN
XWOR%3: VAL NPVDKF+XWOR%2 < TRANSLATION DES OCTETS GAUCHES,
XWOR%4: VAL XWOR%3+NOCMO-Z < TRANSLATION DES OCTETS DROITS.
<*******************************************************************************
DO XWOR%1
BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4
XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
IF XWOR%2-K,,XEIF%,
XWOR%5: VAL XWOR%5(MOCG < CAS D'UNE TABLE DE LONGUEUR IMPAIRE,
$EQU $-D < ON REVIENT SUR LE DERNIER MOT,
WORD XWOR%5 < ET ON ECRASE LE DERNIER OCTET...
XEIF%: VAL ENDIF
CALL #SISP CMS5 DOL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< H A N D L E R ' D K F ' :
<
<
< ARGUMENTS:
< (L)=ADRESSE DE LA 'DCT' DE 'DKF',
< (W)=ADRESSE DE LA DEMANDE A TRAITER,
< (A)='NSPTYP' DE CETTE DEMANDE.
<
< FONCTION:
< CE HANDLER A A SA CHARGE DE
< GERER LE DISQUE FIXE 'DKF' ;
< IL PREND LA DEMANDE DE TETE,
< LANCE L'ECHANGE DEMANDE, ATTEND
< L'INTERRUPTION CORRESPONDANTE,
< ET ANALYSE LA FACON DONT IL
< S'EST DEROULE...
< SI 'DKF' EST DECLARE ABSENT DANS 'ETASYS',
< LA DEMANDE EST TRANSFEREE SUR 'DKM' QUI
< ASSURERA SA SIMULATION DANS LA
< LA ZONE DE COPIE 'DKF' --> 'DKM'...
<
<
USE L,DCT0
USE W,DEM0
HDLDKF: EQU $
<
< VALIDATION DE LA DEMANDE :
<
TBT TYPAD < ADRESSE MOT OU OCTET ???
JC DKF11 < MOT...
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTETS DU BUFFER :
TBT NBITMO-B < EST-IL BIEN A UNE FRONTIERE DE MOTS ???
JNC SYSRB3 < OUI, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VOIR D'OU VIENT CET
< ECHANGE BIZARRE ; C'EST
< PEUT-ETRE UN PROGRAMME
< ESCLAVE SOUS ":SYS" QUI
< S'EST CONNECTE DIRECTEMENT
< A 'DKF' !!!
<
SYSRB3: EQU $
DKF11: EQU $
LA ETASYS
TBT NSPDKF-NSPDK < 'DKF' EST-IL LA ???
JNC DKF20 < NON, ON VA SIMULER...
<
<
< A C C E S A U V R A I ' D K F ' :
<
<
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DE L'ECHANGE :
JAE ERDKF3 < (CODEM)=0 : ERREUR...
ADRI NOCMO-E,A < ARRONDI EVENTUEL AU MOT SUPERIEUR...
SLRS NOCMO=K < CONVERSION EN UN NOMBRE DE MOTS,
CP VAR+NMMDKF < ET VALIDATION...
JG ERDKF3 < (CODEM) EST TROP GRAND : ERREUR...
LA ARGDEM+ASDEM < (A)=ADRESSE DU PREMIER SECTEUR :
JAL ERDKF4 < ADRESSE INEXISTANTE...
CP VAR+NOSDKF < ET VALIDATION...
JGE ERDKF4 < (ASDEM) INEXISTANT : ERREUR...
<
< ALLOCATION EVENTUELLE D'UN
< JEU DE REGISTRES 'HDC' :
<
CPZ VAR+XRHDCF < EN-A-T'ON DEJA UN ???
JNE DKF11X < OUI, RIEN A FAIRE...
PSR X
LAD VAR+CCDKF
SVC SVCM4 < ALLOCATION D'UN CONTEXTE 'HDC'...
PLR X
IC VAR+XRHDCF < MEMORISONS QU'UN JEU DE REGISTRES
< 'HDC' EST EN LA POSSESSION DE 'DKF'.
DKF11X: EQU $
<
< CONSTRUCTION DU 'CCB' :
<
STZ VAR+CCDKG0 < REINITIALISATION DU MOT0 (EN PARTICULIER
< ON RAZE LE BIT DE COMPTE-RENDU).
LA NSPTYP
TBT TYPAD < ADRESSE NOT OU OCTET ???
LA ARGDEM+AMDEM < (A)=ADRESSE ARGUMENT.
JC DKF12 < C'EST UNE ADRESSE MOT, OK...
SLRS NOCMO=K < CAS DES ADRESSES OCTET.
DKF12: EQU $
STA VAR+CCDKG2 < MOT2=ADRESSE-MOT BUFFER.
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DU BUFFER,
ADRI NOCMO-E,A < ARRONDI A L'EVENTUEL MOT SUPERIEUR,
SLRS NOCMO=K < CONVERSION EN UN NOMBRE DE MOTS,
STA VAR+CCDKF3 < MOT3=LONGUEUR-MOTS DU BUFFER.
LB VAR+INIDKF < (B)=ADRESSE DU COUPLEUR,
LA ARGDEM+OPDEM < (A)=(OPDEM) POUR DETERMINER LE SENS :
XWOR%1: VAL FGW?FGR=K < ACCES AU BIT DISCRIMINANT LA
< LECTURE DE L'ECRITURE...
TBT NBITMO-B-XWOR%1
JNC DKF5XX < CAS DE LA LECTURE...
ADRI FPHOUT-FPHIN,B < CAS DE L'ECRITURE...
DKF5XX: EQU $
STB VAR+CCDKF4 < MOT4=ARGUMENT DE LA 'SIO' D'ECHANGE.
DKF5: EQU $
<
< ECHANGE PROPREMENT DIT :
<
LAI MOMINI
SIO VAR+CDDKF < RESET DU COUPLEUR ET DU PERIPHERIQUE...
LA ARGDEM+ASDEM < (A)=ADRESSE DU PREMIER SECTEUR :
CP VAR+AVDKF < EST-ON DANS LA ZONE VIRTUELLE ???
JL DKF5X < NON...
CP VAR+ANVDKF < EST-ON DANS LA ZONE VIRTUELLE ???
JGE DKF5X < NON, ON GARDE 'ASDEM'...
PSR B < OUI, CAR IL EST UTILE...
XWOR%1: VAL XNSPDK=K
SLRD XWOR%1 < (A)=NUMERO DE PISTE,
LR A,X < (X)=NUMERO DE PISTE VIRTUELLE,
LA VAR+CCDKF3 < LONGUEUR EN MOTS DE L'ECHANGE,
CPI YY7 < ECHANGE-T'ON BIEN UN SECTEUR ???
JLE DKF5Y < OUI, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< EXAMINER LA TABLE DE VIRTUALISATION,
< LA DEFINITION DE LA ZONE VIRTUELLE ET
< L'ASDEM...
<
LA ARGDEM+ASDEM < ON RESTAURE L'ASDEM...
JMP DKF5Z < ET ON NE FAIT RIEN...
DKF5Y: EQU $
LBY &VAR+ATVDKF < (A)=NUMERO DE PISTE REELLE...
SLLD XWOR%1 < ET ON RECONCATENE...
DKF5Z: EQU $
PLR B
DKF5X: EQU $
<
< ENVOI DES ARGUMENTS :
<
SIO VAR+SADKF < SORTIE DE L'ADRESSE DU PREMIER SECTEUR.
LA VAR+CCDKF3 < (A)=LONGUEUR-MOTS DU BUFFER,
ADRI YM7,A
ANDI YM7)MFFFF < (A)=LONGUEUR-MOTS DU BUFFER, MAIS SUR
< UN NOMBRE ENTIER PAR EXCES DE
< SECTEURS,
SIO VAR+CSDKF < SORTIE COMPTE DE SECTEURS SUR LES BITS
< 1 A 8 DU REGISTRE 'A'.
LAD VAR+CCDKF < ADRESSE DU CCB
PSR X
SVC SVCM6 < ADRESSE SUR 20 BITS DANS LE 'CCB'...
PLR X
BSR ASDIPI < ENVOI DU 'CCB' A L''IOP'...
LAI MOMSTR?MOMINT < (A)=LECTURE A PRIORI...
XWOR%1: VAL FPHIN?FPHOUT=K
TBT NBITAB-B-XWOR%1 < LECTURE OU ECRITURE ???
JNC DKF5XY < CAS DE LA LECTURE...
ADRI MOMRW,A < CAS DE L'ECRITURE...
DKF5XY: EQU $
SIO VAR+CDDKF < ET ENFIN LANCEMENT DE L'ECHANGE PAR
< UNE 'SIO' D'ECHANGE...
<
< ATTENTE DE LA FIN D'ECHANGE :
<
BSR ACSWIT < RAZ BETA(SIT) ET ATTENTE DE FIN
< D'ECHANGE. RAPPEL : DANS 'ARIT', LE
< LE MOT D'ETAT 'A' EST LU ET STOCKE
< DANS 'ETAT0' DE LA 'DCT' DE 'DKF'...
BSR ATHDS < EST-CE UNE VRAIE IT QUI EST MONTE
< OU UN DEFSEC/RECOVERY QUI
< A SIMULE LE 'RLSE''SIT' ???
JC DKF5 < C'EST UN DEFSEC/RECOVERY,DONC
< IL EST PLUS PRUDENT DE
< RECOMMENCER L'ECHANGE...
CPZ ETAT0 < CAS D'UNE "VRAIE" INTERRUPTION ; Y-A-T'IL
< EU DES DEFAUTS ???
JL ERDKF5 < OUI, ERREUR...
<
< QUI SAIT, COMPTE-RENDU DE L'ECHANGE :
<
LA VAR+CCDKF0
SBT BCCBCR < MISE EN PLACE DU BIT DE COMPTE-RENDU
STA VAR+CCDKF0 < DANS LE 'CCB',
LAD VAR+CCDKF < (A)=ADRESSE DU 'CCB',
BSR ASDIPI < DEMANDE DE COMPTE-RENDU A L''IOP'...
LA VAR+CCDKF3 < (A)=MOT3 DU 'CCB', C'EST-A-DIRE COMPTE-
< COMPTE-RENDU DU CANAL 'HDC' SUR
< LES BITS 0-1 POUR L'ETAT, ET 2-15
< POUR LE COMPTE DE MOTS RESIDUELS :
< SIGNIFICATION DES BITS 0-1 :
< =00 : OK, TOUT S'EST BIEN PASSE,
< =01 : L'ECHANGE S'EST ARRETE SUR UN
< DEFAUT SECTEUR, OU UN 'INI',
< =10 : UNE PARITE MEMOIRE A ETE RENCON-
< TREE AU COURS DE L'ECHANGE,
< =11 : UNE MEMOIRE INEXISTANTE A ETE
< RENCONTREE AU COURS DE L'ECHANGE.
< LES BITS 2-15, QUANT A EUX, DONNENT LE
< COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
< GE (NORMALEMENT NUL...).
JAE DKF2 < OK, LES BITS 0-1 SONT NULS, ET LE
< COMPTE DE MOTS RESIDULES EST NUL...
JAG SYSRB4 < MAUVAIS, MAIS CE N'EST NI UNE PARITE,
< NI UNE MEMOIRE INEXISTANTE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< IDENTIFIER ET LOCALISER
< LA MEMOIRE INEXISTANTE OU
< LA PARITE !!!
<
JMP ERDKF5 < ET ERREUR...
SYSRB4: EQU $
TBT BCCBDC < EN SUPPOSANT QUE LA 'SYSER' PRECEDENTE
< NE S'EST PAS PRODUITE, EST-CE UN DEFAUT
< SECTEUR (OU UN 'INI') ???
JC ERDKF5 < OUI...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT ON
< PEUT AVOIR UN COMPTE DE
< MOTS RESIDUELS NON NUL ???
< RELANCER L'ECHANGE PAR UNE
< SORTIE EN ERREUR : 'JMP ERDKF4'...
<
DKF2: EQU $
<
<
< S O R T I E N O R M A L E :
<
<
STZ ETAT0
DKF3: EQU $
<
< DESALLOCATION EVENTUELLE DU
< JEU DE REGISTRES 'HDC' :
<
CPZ VAR+XRHDCF < A-T'ON UN JEU ???
JE DKF3X < NON, CAS DES ERREURS SITUEES AU DEBUT,
< OU DES SIMULATIONS SUR 'DKM'.
LA ETASYS < OUI, MAIS
TBT BRCDKF < PEUT-ON LE GARDER ???
JC DKF3X < OUI...
STZ VAR+XRHDCF < NON, ON LE REND...
PSR X
LAD VAR+CCDKF
SVC SVCM5 < DESALLOCATION DU CONTEXTE 'HDC'...
PLR X
DKF3X: EQU $
RSR
<
<
< T R A I T E M E N T D E S E R R E U R S S O F T W A R E :
<
<
ERDKF3: EQU $ < COMPTE DE MOTS INVALIDES :
LBY VAR+NMMDKF < LORSQUE LA TAILLE DU BUFFER EST
< TROP GRANDE, LE CODE D'ERREUR
< RETOUR EST PRECISEMENT NMMDKF/YY8
< CECI EST UTILISE PAR LE SWAPPER.
< ("LE SWAPPER CAMEMBERT"...)
JMP DKF4 < VERS LA SORTIE DES ERREURS SOFTWARE...
ERDKF4: EQU $ < ADRESSE SECTEUR INEXISTANTE :
EDKAI:: VAL 3 < ERREUR 'ADRESSE INEXISTNTE'.
LAI CORBT?NBITMO-B=FMASK(K?EDKAI=FCINST
DKF4: EQU $
STZ ETAT1 < ETAT1=0 POUR UN DEFAUT SOFWARE,
SBT NBITMO-B
STA ETAT0 < ETAT0=CODE D'ERREUR...
JMP DKF3 < VERS LA SORTIE...
<
<
< T R A I T E M E N T D E S E R R E U R S H A R W A R E :
<
<
ERDKF5: EQU $
<
< NOTA :
< DANS LE CAS DES ERREURS
< HARDWARE, 'ETAT0' ET 'ETAT1'
< CONTIENNENT (VOIR 'ARIT')
< LES MOTS D'ETAT 'A' ET 'B',
< IL N'Y A DONC RIEN D'AUTRE
< A FAIRE ; DE PLUS L'OCTET0
< DE 'ETAT0' ETANT NON NUL,
< IL Y AURA UN 'RETRY'...
<
JMP DKF3 < VERS LE RETOUR...
<
<
< S I M U L A T I O N ' D K F ' S U R ' D K M ' :
<
<
DKF20: EQU $
LA NSPTYP
XWOR%2: VAL '0000 < INITIALISATION DU MASQUE INDICATEURS.
XWOR%2: VAL COSBT?PRIO=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?BACT=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?VBOX=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
MKTD:: VAL XWOR%2 < EN EFFET, CE MASQUE SERA RE-UTILISE
< PAR LES MEMOIRES VIRTUELLES DKA ET DKB,
< AINSI QUE LORS D'UNE EVENTUELLE SIMU-
< LATION DE 'DKU' SUR 'DKM'.
ANDI MKTD < ON NE CONSERVE QUE QQ INDICATEURS, QUE
STA VAR+DEMFM+XXNSP < L'ON PLACE DANS LA DEMANDE DKF --> DKM.
LAI NSPDKM
STBY VAR+DEMFM+XXNSP < AFIN D'ATTEINDRE 'DKM'.
LAD VAR+DEMFM+T
LR A,B < (B)=RECEPTEUR=DEMANDE LOCALE A 'DKF'.
LAD ARGDEM+OPDEM < (A)=EMETTEUR=DEMANDE ARGUMENT (OPDEM...)
LXI ASDEM-OPDEM+Z < (X)=NOMBRE DE MOTS A DUPLIQUER...
MOVE < DUPLICATION DE OPDEM, AMDEM, CODEM
< ET ASDEM.
IF XDKSYM-K,,XEIF%,
IF ATTENTION : LE 'GB' DE SIMULATION DE 'DKF' SUR 'DKM'
IF DOIT ETRE LE PREMIER...
XEIF%: VAL ENDIF
PSR W < SAVE L'ADRESSE DE LA DEMANDE...
LAD VAR+DEMFM
LR A,W < (W)=ADRESSE DE LA DEMANDE "LOCALE"...-
BSR ACHAND < ENVOI DE LA DEMANDE DKF --> DKM ; ON
< NOTERA QUE 'DKM' DISCRIMINERA CET APPEL
< PAR 'ETASYS' ET LE CONTENU DE 'ETADEM'.
BSR ACHANW < ATTENTE DE FIN D'ENTREE-SORTIE...
LA ARGDEM+ETADEM < TRANSMISSION DES
STA ETAT0 < CONDITIONS DE RETOUR...
PLR W < ON RESTAURE...
JMP DKF3 < ET C'EST TOUT...
PAGE
<
<
< R O U T I N E D ' I T D K F
<
<
< RAPPEL :
< ON TRAVAILLE EN MODE 'HDC' SUR 'DKF' ; EN CONSEQUENCE
< ON RECUPERE UNE INTERRUPTION EXCEPTION EN FIN
< D'ECHANGE, QUE L'ON FAIT RETOMBER PAR UNE 'SIO'
< D'ETAT AVEC AU PASSAGE LE STOCKAGE DES MOTS
< D'ETAT 'A' ET 'B' DANS 'ETAT0' ET 'ETAT1' DE 'DCTDKF'
< POUR EXPLOITATION ULTERIEURE PAR LE HANDLER 'DKF'...
< ON NE REVEILLE LE HANDLER QUE S'IL Y A UN
< ECHANGE EN COURS.
<
<
< NOTA :
< EN CAS D'INTERRUPTION
< NORMALE, ON FERA UNE 'SYSER'...
<
<
< ARGUMENT :
< (B)=0 : INTERRUPTION NORMALE,
< (B)=1 : INTERRUPTION EXCEPTION.
<
<
ITDKF: EQU $
CPZR B < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JNE SYSRB5 < EXCEPTION, CE QUI EST "NORMAL"...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE :
< COMPRENDRE COMMENT UNE
< INTERRUPTION NORMALE A PU
< APPARAITRE !!!
<
SYSRB5: EQU $
SIO VAR+EADKF < LECTURE DU MOT D'ETAT 'A',
STA ETAT0 < ET MISE DANS 'ETAT0'.
SIO VAR+EBDKF < LECTURE DU MOT D'ETAT 'B',
STA ETAT1 < ET MISE DANS 'ETAT1'.
BSR ATEC < Y-A-T'IL UN ECHANGE EN COURS ???
JE ITDKF1 < NON, DONC PAS DE REVEIL DE 'HDLDKF'...
BSR ARVHDL < OUI, REVEIL DE 'HDLDKF'...
ITDKF1: EQU $
RSR
PAGE
<
<
< R O U T I N E D E S R E P R I S E S D K :
<
<
< FONCTION :
< CE MODULE EST CHARGE DE REGARDER,
< LORSQU'IL Y A EU ERREUR, S'IL Y A
< ENCORE DES ESSAIS A TENTER ; SINON,
< POUR 'DKM' ET 'DKF', LORSQ'IL S'AGIT
< D'UNE LECTURE ('FGR'), IL POSITIONNE
< L'ENSEMBLE DU BUFFER AVEC 'Q8000',
< EN ESPERANT QUE TOUT LE MONDE S'EN
< CONTENTERA...
<
<
< ARGUMENT :
< (X)=NBRE D'ESSAIS RESTANT A TENTER.
<
<
< RESULTAT :
< (A)=K : OK, PAS DE REPRISE,
< #0 : REPRISE DE L'OPERATION (IL Y A EU UN
< DEFAUT HARD SUR LE DK.
<
<
TRYDKF: EQU $ < ENTRY 'DKF'.
TRYDKM: EQU $ < ENTRY 'DKM'.
<
< COMMENT CELA S'EST-IL PASSE ???
<
CPZ ETAT0 < COMMENT CELA S'EST-IL PASSE ???
JE TRYDKZ < TRES BIEN...
<
< MAL, QU'Y FAIRE ???
<
LBY ETAT0 < NON, ERREUR SOFT OU HARD ???
JAE TRYDKS < SOFT, VERS UNE SYSER IMMEDIATE...
LR X,A < HARD, (A)=NBRE D'ESSAIS RESTANT A TENTER.
CPI XXNTRY < EST-CE LE DERNIER ESSAI ????
JG TRYDKZ < NON, LAISSONS LUI AU MOINS
< UNE CHANCE...
TRYDKS: EQU $
LA ETASYS < ACCES A L'ETAT DU SYSTEME,
TBT BTRYDK < FAUT-IL FAIRE UNE 'SYSER' ???
JNC TRYDKX < 0 ==> ET OUI...
STZ ETAT0 < 1 ==> NON, ET ON FAIT MEME CROIRE
< QUE TOUT C'EST BIEN PASSE PAR LA
< REMISE A 0 DE 'ETAT0'...
JMP SYSRB6 < VERS LA RECUPERATION DE 'ETAT0' (...).
TRYDKX: EQU $
BSR ASYSER < E R R E U R F A T A L E ...
<
< QUE FAIRE ???
< ATTENTION, ON A EPUISE
< TOUTES LES TENTATIVES DE
< 'RETRY' !!!
<
SYSRB6: EQU $
<
< TRAITEMENT DES DEFAUTS SUR 'LECTURE' :
<
XWOR%1: VAL FGR?FGW=K < BIT DISCRIMINANT LECTURE/ECRITURE.
LA ARGDEM+OPDEM
TBT NBITMO-B-XWOR%1 < SENS DE L'OPERATION ???
JC TRYDKZ < ECRITURE, ON LAISSE LE BUFFER...
PSR X,Y < LECTURE : ON VA TRUANDER LE BUFFER...
LA ARGDEM+CODEM
ADRI NOCMO-E,A
SLRS NOCMO=K
LR A,X < (X)=NOMBRE DE MOTS A ECHANGER,
LA NSPTYP
TBT TYPAD < ADRESSE MOT, OU OCTET ???
LA ARGDEM+AMDEM
JC TRYDK1 < MOT, PAS DE DECALAGE...
ADRI NOCMO-E,A < OCTET...
SLRS NOCMO=K
TRYDK1: EQU $
LR A,Y < (Y)=ADRESSE-MOTS DU BUFFER...
< (DANS UNE PAGE DE 32K)
LA ARGDEM+ASDEM < ACCES AU PREMIER SECTEUR :
IF XXGB-K,,XEIF%,XEIF%
IF ATTENTION : 'XXGB' EST MAUVAIS !!!
XEIF%: VAL ENDIF
IF XXGB-K,XEIF%,XEIF%,
CPI XXGB < EST-CE UN MORCEAU DE 'TOGB' ???
JL TRYDK2 < NON...
XEIF%: VAL ENDIF
CPI XXGB+NSTO < EST-CE UN MORCEAU DE 'TOGB' ???
JGE TRYDK2 < NON...
<
< CAS D'UNE ERREUR DE LECTURE SUR UN MORCEAU DE 'TOGB' :
<
LR X,A < (A)=NOMBRE DE MOTS A ECHANGER,
CPI YY7 < ET VALIDATION...
JE TRYDK4 < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< REGARDER LE DEMANDEUR DE L'ECHANGE QUI DOIT
< ETRE 'DKA', ET VOIR ALORS QUI EST LE DEMANDEUR
< DE 'DKA' QUI DEVRAIT ETRE 'GET'/'REL'...
<
TRYDK4: EQU $
LAI MMOT)MMOT < VALEUR DE REINITIALISATION D'UN BUFFER
< DE 'TOGB'...
JMP TRYDK3 < VERS LA REINITIALISATION...
<
< CAS D'UNE ERREUR DE LECTURE SUR
< UN BLOC N'APPARTENANT PAS A 'TOGB' :
<
TRYDK2: EQU $
LA INFINI < VALEUR DE REINITIALISATION : ON CHOISIT
< CELLE-CI CAR ELLE CORRESPOND A UNE FIN
< DE QUELQUE CHOSE POUR LE 'SGF' ET LE
< 'SGN'...
<
< REINITIALISATION DU BLOC EN ERREUR :
<
TRYDK3: EQU $
TRYDKY: EQU $
STAR
ADRI P,Y < PARTOUT...
JDX TRYDKY
PLR X,Y
TRYDKZ: EQU $
<
< RETOUR :
<
TRYDKU: EQU $ < ENTRY 'DKU'.
LBY ETAT0 < (A)=PARTIE DU MOT D'ETAT DU
< DK RELATIVE AUX ERREURS HARD ;
< AINSI, S'IL Y A EU DES
< ERREURS HARD, ON RECOMMENCERA
< L'OPERATION AVEC LE DK.
RSR
PAGE
<
<
< C O N S T A N T E S D I V E R S E S
< D I S Q U E S A M O V I B L E S :
<
<
XXDK1:: VAL 10 < INCREMENT DE LA LONGUEUR DE LA PILE.
XXDK2:: VAL '4000 < NOMBRE DE MOTS MAX ECHANGEABLES.
XXDK3:: VAL 1 < NUMERO DU JEU DE REGISTRES 'HDC'.
< (EN FAIT ALLOUE DYNAMIQUEMENT...)
XWOR%1: VAL COSBT?XBITQ=FMASK(K?FGR=FCINST
XWOR%2: VAL COSBT?XBITQ=FMASK(K?FGW=FCINST
XWOR%3: VAL K
XWOR%3: VAL COSBT?FGR=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?FGW=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%1=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%2=FMASK(K?XWOR%3=FCINST
XXDK5:: VAL XWOR%3 < LISTE DES FONCTIONS RECONNUES.
XXDK6T:: VAL 200/THALT < TEMPORISATION DE 200 MICRO-SECONDES
< DESTINEE A ESPACER SUFFISAMMENT
< CERTAINES 'SIO' AFIN D'EVITER DES
< PERTES ALEATOIRES DU READY ???!?!?!
XWOR%3: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?XBITQ=FMASK(K?FGR=FCINST
XWOR%2: VAL COSBT?XBITQ=FMASK(K?FGW=FCINST
XWOR%3: VAL COSBT?FGR=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?FGW=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%1=FMASK(K?XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%2=FMASK(K?XWOR%3=FCINST
XXDK6:: VAL XWOR%3 < LISTE DES "ALTITUDES" POUR 'DKM' ; POUR
< 'DKU', IL FAUDRA LA COMPLETER...
PAGE
<
<
< D C T D K M :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
DCTDKM: EQU $
PSTDKM: WORD K;K;K;K;COM+DEPCS;DCTDKM;NIL;PILDKM;HANDLR;SMST;SO;SE
#@ASCI " DKM" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XXDCTP < ETALOC=XXDCTP : 'DKM' NON LOUABLE...
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'DKM',
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'DKM'.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLDKM < HANDLER SPECIFIQUE DE GESTION DE 'DKM'.
WORD ITDKM < ROUTINE SPECIFIQUE DE TRAITEMENT DES
< INTERRUPTIONS DE 'DKM'.
WORD K;K < ETAT.
WORD COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
WORD XXDK4;TRYDKM < NTRIES ET FRTRY.
WORD K < HSTATS.
XWOR%2: VAL 2
WORD XWOR%2*DKCMS4 < TESTO#0 : TIME-OUT A TESTER...
WORD XXDK5 < LISTE DES FONCTIONS RECONNUES.
WORD XXDK6 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARDKM: EQU $
IF VARDKM-DCTDKM-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACDKM?FPHCME
ASDKM:: VAL $-D-VARDKM < SORTIE ADRESSE SECTEUR.
WORD ACDKM?FPHCMD
CDDKM:: VAL $-D-VARDKM < SORTIE COMMANDE.
WORD ACDKM?FPHETA
EADKM:: VAL $-D-VARDKM < ENTREE DU MOT D'ETAT 'A'.
WORD ACDKM?FPHETB
EBDKM:: VAL $-D-VARDKM < ENTREE DU MOT D'ETAT 'B'.
WORD ACDKM
INIDKM:: VAL $-D-VARDKM < POUR INITIALISER LE 'CCB'.
<
< 'CCB' DU DISQUE 'DKM' :
<
WORD COSBT?CCBDKM=FMASK(K=FCINST
DSYNC0:: VAL $-D-VARDKM < POUR INITIALISER 'CCDKM0' ; IL CONTIENT
< ENTRE AUTRE LE BIT 'CCBDKM' PERMETTANT
< LA SYNCHRONISATION SUR LE SECTEUR 0...
WORD K
CCDKN2:: VAL $-D-VARDKM < POUR INITIALISER 'CCDKM2'...
CCDKM:: VAL $-VARDKM < 'CCBDKM' :
WORD COSBT?CCBDKM=FMASK(K=FCINST
CCDKM0:: VAL $-D-VARDKM < MOT0 :
< BIT6=1 : DISQUE A TETE MODILE.
BYTE CCBHDC?XSNDKM;XXDK3 < MOT1 :
< BITS 0-1 : MODE 'HDC',
< BITS 2-7 : SOUS-NIVEAU NORMAL,
< BITS 11-15 : NUMERO DU JEU DE REGISTRES
< 'HDC' ALLOUES.
WORD NIL
CCDKM2:: VAL $-D-VARDKM < MOT2 : ADRESSE-MOT DU BUFFER.
WORD NILK
CCDKM3:: VAL $-D-VARDKM < MOT3 : LONGUEUR-MOTS DU BUFFER.
WORD ACDKM
CCDKM4:: VAL $-D-VARDKM < MOT4 : OPERANDE DE LA 'SIO' D'ECHANGE :
< BITS 13-15=000 : LECTURE,
< =001 : ECRITURE.
WORD NILK
CCDKM5:: VAL $-D-VARDKM < MOT5 : IL CONTIENT LE 'HEADER 1' DU
< PREMIER SECTEUR DE L'ECHANGE.
<
< INFORMATIONS DE DIMENSIONNEMENT :
<
<*******************************************************************************
WORD XXDK2
XWOR%1: VAL '0000000@@@@ < NOMBRE DE MOTS MAX ECHANGEABLES.
<*******************************************************************************
NTRN
XWOR%2: VAL XXSGN9+NOCMO-E/NOCMO
TRN
IF XWOR%2-XWOR%1,XEIF%,XEIF%,
IF ATTENTION : LE NOMBRE MAX D'OCTETS GROUPABLES
IF PAR LE 'SGN' DOIT ETRE INFERIEUR OU EGAL AU
IF NOMBRE DE MOTS MAX ECHANGEABLES PAR 'DKM' !!!
XEIF%: VAL ENDIF
NMMDKM:: VAL $-D-VARDKM < LONGUEUR-MOTS MAXIMALE D'UN ECHANGE.
<
< RELAIS DE SOUS-PROGRAMMES :
<
WORD SPDKM
ASPDKM:: VAL $-D-VARDKM < SOUS-PROGRAMME VIDE POUR 'DKM' ET
< DESTINE A DETECTER LES MEMOIRES INEX-
< ISTANTES POUR 'DKU'...
<
< POUR LA GESTION DES ADRESSES :
<
WORD K
SUIDKM:: VAL $-D-VARDKM < INDICATEUR DE "SUITE" : CE MOT EST UTI-
< POUR POURSUIVRE UN ECHANGE A CHEVAL SUR
< UNE FIN DE CYLINDRE.
WORD NILK
CYL:: VAL $-D-VARDKM < NUMERO DE CYLINDRE.
WORD NILK
PIST:: VAL $-D-VARDKM < NUMERO DE PISTE.
WORD NILK
SECT:: VAL $-D-VARDKM < NUMERO DE SECTEUR.
XWOR%1: VAL 24 < NOMBRE DE SECTEURS PAR PISTE.
XDKMSP:: VAL XWOR%1 < NOMBRE DE SECTEURS PAR PISTE.
XWOR%2: VAL XWOR%1/QUANTA < NOMBRE DE QUANTUM PAR PISTE.
XWOR%3: VAL XWOR%2*QUANTA-XWOR%1
IF -XWOR%3,,XEIF%,
IF A T T E N T I O N : 'QUANTA' NE DIVISE
IF PAS EXACTEMENT LE NOMBRE DE SECTEURS
IF PAR PISTE !!!
XEIF%: VAL ENDIF
WORD XWOR%2
NBSPP:: VAL $-D-VARDKM < NOMBRE DE SECTEURS PAR PISTE.
WORD XWOR%1
NBSRPP:: VAL $-D-VARDKM < NOMBRE REEL DE SECTEURS PAR PISTE ;
< IL EST UTILISE A LA PLACE DE 'NBSPP'
< LORSQU'ON SIMULE 'DKF' SUR 'DKM'...
WORD NUQFM/2
VALFM:: VAL $-D-VARDKM < AFIN DE VALIDER LES ADRESSES DEMANDES
< LORSQUE L'ON SIMULE 'DKF' ET QU'IL
< N'EST PAS DEMANDEUR ; ON DIVISE PAR 2
< CAR EN EFFET, LES ADRESSES SECTEURS
< SONT SUR 16 BITS, ET PEUVENT DONC
< ETRE DES NOMBRES NEGATIFS...
XDKMPC:: VAL 20 < NOMBRE DE PISTES PAR CYLINDRE.
WORD XDKMPC
NBPPC:: VAL $-D-VARDKM < NB DE PISTES PAR CYLINDRE
MINCYL:: VAL K < PREMIER CYLINDRE RECONNU (ON EN FAIT UN
< 'VAL' ET NON PAS UN 'WORD', CAR LA
< 'DCTDKU' EST SATUREE...).
NAXCYL:: VAL XAXCYL-Z < NOMBRE DE CYLINDRES...
WORD NAXCYL
MAXCYL:: VAL $-D-VARDKM < DERNIER CYLINDRE RECONNU.
WORD QUANTA
DKMQUA:: VAL $-D-VARDKM < VALEUR DU QUANTA, UTILISEE PAR 'DKU'
< LORSQU'IL EST SIMULE SUR 'DKM'.
WORD YY8Q
DKMLS:: VAL $-D-VARDKM < NOMBRE D'OCTETS CONTENUS DANS UN
< BLOC DE 'QUANTA' SECTEURS.
WORD TVDKM,X
ATVDKM:: VAL $-D-VARDKM < ACCES A LA TABLE DE VIRTUALISATION DES
< GROUPES DE CYLINDRES.
<
< ALLOCATION DES REGISTRES 'HDC' :
<
WORD XXNHDC
XRHDCM:: VAL $-D-VARDKM < INDICATEUR DE L'ETAT D'ALLOCATION D'UN
< JEU DE REGISTRES 'HDC' :
< 0 : PAS DE JEU ALLOUE (HANDLER INACTIF,
< OU ERREUR DE DEBUT...),
< 1 : UN JEU A ETE ALLOUE (HANDLER ACTIF,
< CONTRAIREMENT A 'DKF'...).
<
< PROTECTION DES CYLINDRES PAR GROUPE :
<
NTRN
NCYLP:: VAL XAXCYL+NBITMO-E/NBITMO
< NOMBRE DE CYLINDRES CONSTITUANT UN
< GROUPE D'APPROPRIATION ET ASSOCIES
< A UN BIT DE 'LSDK' ET 'LUDKU' (DANS
< CHAQUE 'DCTESC').
TRN
LSDKM: EQU $
DZS LOSDKM
XWOR%7: VAL $-LSDKM
IF XWOR%7-LOSDKM,,XEIF%,
IF ATTENTION : LA LONGUEUR PRESUMEE DE LA LISTE
IF DES GROUPES DE CYLINDRES APPROPRIES DE 'DKM'
IF (FAITE DANS LE BUFFER DE 'COPY') EST MAUVAISE !!!
XEIF%: VAL ENDIF
LSDK:: VAL $-D-VARDKM < LISTE DES GROUPES DE 'NCYLP' CYLINDRES
< APPROPRIES.
<
< ACCES A LA LISTE DES
< TRANSLATIONS EN Q=1 :
<
WORD TASQM,X
ATASQ:: VAL $-D-VARDKM < RELAI D'ACCES A UNE LISTE DE DOUBLE-MOTS
< CONTENANT DES COUPLES : LISTE D'APPRO-
< PRIATION DES GROUPES DE CYLINDRE, TRANS-
< LATION DES ADRESSES LORSQUE Q=1.
<
<
< A T T E N T I O N :
< Z O N E S P E C I F I Q U E ' D K M ' :
<
<
WARDKM: EQU $
WORD DKMGS
ADKMGS:: VAL $-D-VARDKM < INITIALISATION SANS ENTREE SORTIE DE
< CERTAINS BUFFERS...
WORD LDKMN-IJIJDX,X
ALDKMN:: VAL $-D-VARDKM < RELAI D'ACCES A LA LISTE DES 'NSP'
< POUVANT ACCEDER A 'DKM'...
LDKMN: EQU $
WORD NSPDKB
WORD NSPDKF
WORD NSPDKU
WORD NSPHOR
WORD NSPREL
WORD NSPGET
LLDKMN:: VAL $-LDKMN < LONGUEUR EN MOTS DE CETTE LISTE ; SI
< CETTE LISTE EST UNE LISTE DE MOTS
< C'EST POUR DES RAISONS D'ECONOMIE
< DE CODE LORS DU TEST (TOUJOURS A CAUSE
< DES SAUTS SUPERIEURS A 128 MOTS...)
<
< PILE :
<
CALL #SISP CMS5 DOL2#
PILDKM: EQU $-DEPILE < PILE DKM
XWPILE: VAL LPILEH+XXDK1
CALL #SISP CMS5 GENPIL2#
PAGE
<
<
< Z O N E D E V I R T U A L I S A T I O N
< D E S G R O U P E S D E C Y L I N D R E S :
<
<
< FONCTION PRINCIPALE :
< SUR 'DKM' RAMENER LA ZONE DE COPIE
< DE 'DKF', ET DONC SA ZONE DE SIMULATION
< A MI-CHEMIN DES EXTREMITES DE 'DKM', PUIS
< ACCEDER A DES GROUPES DE RESERVE...
<
<
CALL #SISP CMS5 DOL1#
TVDKM: EQU $ < DEBUT DE LA ZONE DE VIRTUALISATION.
TVDKMQ: EQU TVDKM < A CAUSE DES REFERENCES EN AVANT DESSUS...
NTRN
XWOR%1: VAL GAXCYL+NOCMO-E/NOCMO
XWOR%2: VAL GAXCYL/NOCMO(K=FCREST
TRN
XWOR%3: VAL GAXCYL+XWOR%2 < INCREMENT DES OCTETS GAUCHES,
XWOR%4: VAL XWOR%3+NOCMO-Z < INCREMENT DES OCTETS DROITS.
<*******************************************************************************
DO XWOR%1
BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4
XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
IF XWOR%2-K,,XEIF%,
XWOR%5: VAL XWOR%5(MOCG < DANS LE CAS D'UNE TABLE DE LONGUEUR
< IMPAIRE, ON EFFACE LE DERNIER OCTET
< GENERE,
$EQU $-D < ON REVIENT D'UN MOT EN ARRIERE,
WORD XWOR%5 < ET ON REGENERE LE DERNIER MOT...
XEIF%: VAL ENDIF
CALL #SISP CMS5 DOL2#
<
<
< E S P A C E I N U T I L I S E S U R ' D K M ' :
<
<
SDKMTO:: VAL XAXCYL*XDKMSP/QUANTA*XDKMPC
< NOMBRE TOTAL DE Q-SECTEURS SUR 'DKM',
< A COMPARER A 'SDKM'...
SDKMLI:: VAL SDKMTO-SDKM < NOMBRE DE Q-SECTEURS INUTILISES.
IF SDKMLI-K,,,XEIF%
IF ET BIEN, CELA NE FAIT PAS BEAUCOUP !!!
XEIF%: VAL ENDIF
XWOR%1: VAL CAXCYL=K
XWOR%1: VAL -XWOR%1
XWOR%2: VAL SDKM+CAXCYL-E>XWOR%1
NTRN
SDKMGL:: VAL XWOR%2*QUANTA+XDKMSP-E/XDKMSP+XDKMPC-E/XDKMPC
TRN
< NOMBRE DE GROUPES DE CYLINDRES DISPO-
< NIBLES, A COMPARER A 'GAXCYL'...
PAGE
<
<
< L I S T E D E S T R A N S L A T I O N S E N Q = 1 :
<
<
< FONCTION :
< CETTE LISTE EST EN FAIT INUITLE POUR
< 'DKM', MAIS ON LA MET POUR DES RAISONS
< DE SYMETRIE AVEC 'DKU' ; ELLE CONTIENT
< UNE ENTREE PAR UTILISATEUR, SACHANT QU'A
< UN INSTANT DONNE 2 UTILISATEURS NE PEU-
< VENT AVOIR LA MEME LISTE D'APPROPRIATION
< DE GROUPES DE CYLINDRES. CETTE LISTE
< CONTIENT DONC DES COUPLES :
<
< (LISTE D'APPROPRIATION DE GROUPES DE CYLINDRES,
< TRANSLATION DES ADRESSES DISQUES EN Q=1),
<
< POUR TOUT ECHANGE EN Q=1, ON CHERCHE LA
< TRANSLATION D'ADRESSE A EFFECTUER A PARTIR
< DE LA LISTE D'APPROPRIATION DES GROUPES
< DE CYLINDRES ; LE FONCTIONNEMENT EST DONC
< ASSOCIATIF.
<
<
<*******************************************************************************
TRDKU0:: VAL K < TRANSLATION 0,
TRDKU1:: VAL TRDKU0+I < TRANSLATION 1,
TRDKU2:: VAL TRDKU1+I < TRANSLATION 2...
TRDKUM:: VAL '0@@@@ < TRANSLATION MAXIMALE RECONNUE...
<*******************************************************************************
CALL #SISP CMS5 DOL1#
TASQM: EQU $
LOSDK2:: VAL LOSDKM*NBITMO
DO LOSDK2
WORD NILK;TRDKU0 < LISTE VIDE INITIALEMENT...
LTASQ:: VAL $-TASQM < LONGUEUR TOTALE DE CETTE LISTE,
ITASQ:: VAL LTASQ/LOSDK2 < LONGUEUR D'UNE ENTREE,
ITASQT:: VAL ITASQ-D < INDEX DE L'ENTREE CONTENANT LA TRANS-
< LATION DES ADRESSES EN Q=1.
CALL #SISP CMS5 DOL2#
PAGE
<
<
< D C T D K U :
<
<
CALL #SISP CMS5 DOL1#
DCTDKU: EQU $
PSTDKU: WORD K;K;K;K;COM+DEPCS;DCTDKU;NIL;PILDKU;HANDLR;SMST;SO;SE
#@ASCI " DKU" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC=XTALOC :
< 'DKU' EST PARTAGEABLE AVEC LES ASSIGNS
< IMPLICITES, ET
< 'DKU' EST NON PARTAGEABLE AVEC LES
< !ASSIGN EXPLICITES, QUI INHIBENT
< ALORS LES ASSIGNS IMPLICITES...
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'DKU',
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'DKU'.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLDKU < HANDLER SPECIFIQUE DE GESTION DES
< ECHANGES 'DKU' ET DU SYSTEME DE TELEVI-
< SION NUMERIQUE BASSE DEFINITION.
WORD ITDKU < SOUS-PROGRAMME SPECIFIQUE DES GESTION
< DES INTERRUPTIONS DE 'DKU'.
WORD K;K < ETAT.
WORD COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
WORD XXDK4;TRYDKU < NTRIES ET FRTRY.
WORD K < HSTATS.
XWOR%2: VAL 2
WORD XWOR%2*DKCMS4 < TESTO#0 : TIME-OUT A TESTER.
XWOR%1: VAL COSBT?FONTV=FMASK(K?XXDK5=FCINST
XWOR%9: VAL FGR?FGW=K
XWOR%9: VAL NBITMO-B-XWOR%9 < BIT DISCRIMINANT UNE LECTURE D'UNE
< ECRITURE.
XWOR%8: VAL 4 < POUR GENERER 'FONTVR' ET 'FONTVW'.
FONTVR:: VAL CORBT?XWOR%9=FMASK(K?XWOR%8=FCINST
< FONCTION SPECIALE DE TRANSFERT DIRECT
< DE 'DKU' VERS LA MEMOIRE RAPIDE DE
< VISUALISATION...
< 'FONTVR' DOIT ETRE UNE LECTURE.
IF FONTVR(MASSFF-FGX,,,XEIF%
IF ATTENTION : POUR EVITER DE FACHEUSEUSES VALIDATIONS
IF DANS 'HDLSVC', IL FAUT QUE 'FONTVR' SOIT UNE FAUSSE
IF ENTREE-SORTIE !!!
XEIF%: VAL ENDIF
XWOR%1: VAL COSBT?FONTVR=FMASK(K?XWOR%1=FCINST
FONTVW:: VAL COSBT?XWOR%9=FMASK(K?XWOR%8=FCINST
< FONCTION SPECIALE DE TRANSFERT DIRECT
< DE LA MEMOIRE RAPIDE DE VISUALISATION
< VERS 'DKU'...
< 'FONTVW' DOIT ETRE UNE ECRITURE.
IF FONTVW(MASSFF-FGX,,,XEIF%
IF ATTENTION : POUR EVITER LES VALIDATIONS DE 'SVC'
IF 'FONTVW' DOIT ETRE UNE FAUSSE ENTREE-SORTIE !!!
XEIF%: VAL ENDIF
XWOR%1: VAL COSBT?FONTVW=FMASK(K?XWOR%1=FCINST
XWOR%5: VAL COSBT?XBITQ=FMASK(K?FONTVR=FCINST
XWOR%6: VAL COSBT?XBITQ=FMASK(K?FONTVW=FCINST
XWOR%1: VAL COSBT?XWOR%5=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?XWOR%6=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < LISTE DES FONCTIONS RECONNUES.
EDKUX1: EQU $ < POUR DEFINIR DES INSTRUCTIONS EN AVANT :
<*******************************************************************************
LAI FONTVR
XWOR%1: VAL '0000000@@@@ < RECUPERATION DU CODE GENERE...
<*******************************************************************************
LAFTVR: EQU ZERO+XWOR%1 < INSTRUCTION 'LAI FONTVR'.
L1FTVR: EQU LAFTVR < A CAUSE DE L'ASSEMBLEUR...
L2FTVR: EQU LAFTVR < A CAUSE DE L'ASSEMBLEUR...
<*******************************************************************************
LAI FONTVW
XWOR%1: VAL '0000000@@@@ < RECUPERATION DU CODE GENERE...
<*******************************************************************************
LAFTVW: EQU ZERO+XWOR%1 < INSTRUCTION 'LAI FONTVW'.
<*******************************************************************************
CPI FONTVR
XWOR%1: VAL '0000000@@@@ < RECUPERATION DU CODE GENERE...
<*******************************************************************************
CPFTVR: EQU ZERO+XWOR%1 < INSTRUCTION 'CPI FONTVR'.
<*******************************************************************************
CPI FONTVW
XWOR%1: VAL '0000000@@@@ < RECUPERATION DU CODE GENERE...
<*******************************************************************************
CPFTVW: EQU ZERO+XWOR%1 < INSTRUCTION 'CPI FONTVW'.
$EQU EDKUX1 < ANNULATION DU CODE GENERE...
XWOR%1: VAL XXDK6 < INITIALISATION...
XWOR%1: VAL CORBT?FONTVR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL CORBT?FONTVW=FMASK(K?XWOR%1=FCINST
XWOR%5: VAL COSBT?XBITQ=FMASK(K?FONTVR=FCINST
XWOR%6: VAL COSBT?XBITQ=FMASK(K?FONTVW=FCINST
XWOR%1: VAL CORBT?XWOR%5=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL CORBT?XWOR%6=FMASK(K?XWOR%1=FCINST
< A T T E N T I O N : 'FONTVR' ET
< 'FONTVW' DOIVENT (PROVISOIREMENT ???)
< S'EXECUTER EN MEMOIRE BASSE ; EN EFFET
< DANS LE CAS CONTRAIRE, A CHAQUE 'SVC'
< SUIVANT QUE L'UTILISATEUR EST EN BAS
< OU EN HAUT, IL N'A PAS, OU IL A, DE
< HANDLER DE SERVICE ; S'IL EST EN BAS,
< LE HANDLER DE SERVICE QU'ON LUI ALLOUE
< RECOIT LA DEFINITION DE LA 'CDA' COURAN-
< TE, PAR CONTRE S'IL EN POSSEDE DEJA UN
< ON NE FAIT QUE LE RE-ACTIVER, SANS LUI
< COMMUNIQUER AUCUN ARGUMENTS (VIA UNE
< DEMANDE DE SERIVES) : IL NE RECOIT DONC
< PAS LA DEFINITION DE LA 'CDA' COURANTE...
XWOR%1: VAL CORBT?FONTV=FMASK(K?XWOR%1=FCINST
< A T T E N T I O N : 'FONTV' NE DOIT
< ABSOLUMENT PAS S'EXECUTER EN MEMOIRE
< HAUTE ; EN EFFET, ELLE UTILISE TROP LA
< BASE 'C' POUR REFERENCER LES LISTES
< DE POINTS LORS DE L'INTERPOLATION...
WORD XWOR%1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<*******************************************************************************
XWOR%F: VAL FONTV
FONTV: @VAL '0@@@@ < FONCTION D'ACCES A LA TELEVISION 256.
CALL #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F: VAL FONTVR
FONTVR: @VAL '0@@@@ < TRANSFERT 'DKU' --> 'MEMTV'.
CALL #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F: VAL FONTVW
FONTVW: @VAL '0@@@@ < TRANSFERT 'MEMTV' --> 'DKU'.
CALL #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F: VAL XBITQ
XBITQ: @VAL '0@@@@ < BIT DISCRIMINANT LE QUANTA D'ACCES 'DKU'.
CALL #SISP CMS5 GEN CTE#
<*******************************************************************************
<
<
< Z O N E V A R I A B L E :
<
<
VARDKU: EQU $
IF VARDKU-DCTDKU-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACDKU?FPHCME
WORD ACDKU?FPHCMD
WORD ACDKU?FPHETA
WORD ACDKU?FPHETB
WORD ACDKU
<
< 'CCB' DE 'DKU' :
<
WORD COSBT?CCBDKM=FMASK(K=FCINST
< 'DSYNC0'.
WORD K < 'CCDKN2'.
WORD COSBT?CCBDKM=FMASK(K=FCINST
BYTE CCBHDC?XSNDKU;XXDK3 < MOT1.
WORD NIL < MOT2 : ADRESSE-MOT DU BUFFER,
WORD NILK < MOT3 : LONGUEUR-MOTS DU BUFFER.
WORD ACDKU
WORD NILK < MOT5 : 'HEADER 1' DU PREMIER SECTEUR.
<
< AUTRES INFORMATIONS (CF. 'DKM') :
<
WORD XXDK2 < LONGUEUR MAXIMALE D'UN ECHANGE.
WORD SPDKU < DETECTION DES MEMOIRES INEXISTANTES...
WORD K < INDICATEUR DE "SUITE".
WORD NILK < NUMERO DE CYLINDRE.
WORD NILK < NUMERO DE PISTE.
WORD NILK < NUMERO DE SECTEUR.
XWOR%1: VAL XDKMSP < NOMBRE DE SECTEURS PAR PISTE.
XWOR%2: VAL XWOR%1/QUANTA < NOMBRE DE QUANTUM PAR PISTE.
XWOR%3: VAL XWOR%2*QUANTA-XWOR%1
IF -XWOR%3,,XEIF%,
IF A T T E N T I O N : 'QUANTA' NE DIVISE
IF PAS EXACTEMENT LE NOMBRE DE SECTEURS
IF PAR PISTE !!!
XEIF%: VAL ENDIF
WORD XWOR%2 < NOMBRE DE "SECTEURS" PAR PISTE.
WORD XWOR%1 < NOMRE REEL DE SECTEURS PAR PISTE.
WORD K < VALIDATION NUMERO 1ER SECTEUR.
WORD XDKMPC
WORD NAXCYL < DERNIER CYLINDRE.
WORD QUANTA
WORD YY8Q
WORD TVDKU,X < ACCES A LA TABLE DE VIRTUALISATION.
WORD XXNHDC < INDICATEUR D'ALLOCATION DE JEUX.
LOSDKU:: VAL LOSDKM < LONGUEUR EN MOTS DE LA LISTE DES
< GROUPES DE CYLINDRES APPROPRIES.
DZS LOSDKU < 'LSDK' : LISTE DES GROUPES DE 'NCYLP'
< CYLINDRES APPROPRIES A DES UTILISATEURS
< VIA 'LUDKU' DANS 'DCTESC'.
WORD TASQU,X < ACCES A LA LISTE DES TRANSLATIONS DES
< ADRESSES EN Q=1.
<
<
< Z O N E S P E C I F I Q U E ' D K U '
<
<
WARDKU: EQU $
XWOR%1: VAL WARDKM-DCTDKM
XWOR%2: VAL WARDKU-DCTDKU
IF XWOR%1-XWOR%2,,XEIF%,
IF ATTENTION : UNE DES DEUX 'DCT' ('DKM' OU 'DKU')
IF EST MAL IMPLANTEE !!!
XEIF%: VAL ENDIF
<
<
< E X T E N S I O N D E S A C C E S ' C D A ' :
<
<
WORD TWOED
ATWOED:: VAL $-D-VARDKU < IL S'AGIT EN FAIT D'UN RELAI DE RELAI,
< CAR, EN EFFET, LORSQUE LE SOUS-PROGRAMME
< 'TWOE' EST NECESSAIRE POUR 'DKU', LA
< BASE 'C' EST EN GENERAL MAUVAISE...
<
<
< A C C E S A U V O L U M E :
<
<
WORD BVOLU
ABVOLU:: VAL $-D-VARDKU < ADRESSE DU BUFFER CONTENANT LE DESCRIP-
< TEUR DU VOLUME COURANT MONTE SUR 'DKU',
< LORSQU'IL EST LA, ET CONTENANT DONC DES
< INDICATEURS SUR LA PRESENCE EFFECTIVE
< D'UN VOLUME...
<
<
< I N T E R P O L A T I O N B A S S E D E F I N I T I O N :
<
<
<
< DEFINITION DE LA LUTTE ANTI-ALIASING :
<
DIMAL1:: VAL W < GESTION MONO-DIMENSIONNELLE DE L'ANTI-
< ALIASING,
DIMAL2:: VAL DIMAL1+I < ET GESTION BI-DIMENSIONNELLE (ELLE DONNE
< DE MOINS BONS RESULTATS, MAIS COMME J'AI
< BEAUCOUP PEINE POUR LE PROGRAMMER, JE NE
< PEUX ME RESOUDRE A L'ELIMINER...).
DIMALI:: VAL DIMAL1 < DIMENSION DE LA LUTTE ANTI-ALIASING
< COURANTE...
<
< NIVEAU DE GRIS MAXIMUM :
<
NIVMAX:: VAL BIT>XNCOOL-N < NIVEAU DE GRIS MAXIMUM DES COULEURS.
<
< FORMAT DE L'EN-TETE D'UNE IMAGE
< LORSQU'UNE INTERPOLATION ENTRE
< DEUX POINTS EST DEMANDEE :
<
<*******************************************************************************
XWOR%1: VAL K-D < INITIALISATION...
DKMTCO:: MOT '0@@@@+D < MOT BIDON DESTINE AU BLOC FLOTTANT
< QUI ECRASE LE MOT D'ADRESSE (C)-'DEPCS' ;
< MAIS, A T T E N T I O N : PAR MANQUE
< DE PLACE, 'DKMTCO' EST MAINTENANT UTI-
< LISE POUR TRANSMETTRE LE CHAMP 'DKMLCOL'
< DONNANT LES NIVEAUX DE GRIS, QUI S'ILS
< SONT RENCONTRES LORS DU MARQUAGE D'UN
< POINT AVEC NIVEAU DE GRIS DOIVENT
< RESTER INTACTS, QUELQUE SOIT LE MODE
< DEMANDE...
DKMTMO:: MOT '0@@@@+D < MODE DU TRACE : VOIR 'DKMTSB'/'DKMTRB' ;
< MAIS ATTENTION,DANS LE CAS DU TRACE
< AVEC NIVEAU DE GRIS, 'DKMTMO' A LE
< FORMAT DECRIT PLUS LOIN...
DKMTY1:: MOT '0@@@@+D < COORDONNEE Y1,
DKMTC:: MOT DKMTY1 < LISTE DES COORDONNEES (FORMAT 'TV').
DKMTX1:: MOT '0@@@@+D < COORDONNEE X1 DU PREMIER POINT,
DKMTY2:: MOT '0@@@@+D < COORDONNEE Y2,
DKMTX2:: MOT '0@@@@+D < COORDONNEE X2 DU DEUXIEME POINT.
DKMGY1:: MOT '0@@@@+D < COORDONNEE Y1,
DKMGC:: MOT DKMGY1 < LISTE DES COORDONNEES (FORMAT 'VISU').
DKMGX1:: MOT '0@@@@+D < COORDONNEE X1 DU PREMIER POINT,
DKMGY2:: MOT '0@@@@+D < COORDONNEE Y2,
DKMGX2:: MOT '0@@@@+D < COORDONNEE X2 DU DEUXIEME POINT.
DKMTXY:: VAL '0@@@@+D < LONGUEUR DE L'EN-TETE...
<*******************************************************************************
DKMTNP:: VAL 2 < NOMBRE DE POINTS DEFINISSANT UN SEGMENT.
IF XXVXY*DKMTNP-DKMTXY+DKMGC,,XEIF%,
IF ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!!
XEIF%: VAL ENDIF
DKMTNS:: VAL 2 < IL Y A DEUX SEGMENTS : LE SEGMENT ARGU-
< MENT EN FORMAT GRAPHIQUE OU 'VISU' BAPTI-
< SE 'DKMG', LE SECOND EN FORMAT 'TV',
< RENVOYE A L'UTILISATEUR APPELE 'DKMT'.
IF XXVXY*DKMTNP*DKMTNS-DKMTXY+DKMTC,,XEIF%,
IF ATTENTION : LE FORMAT DES SEGMENTS EST MAUVAIS !!!
XEIF%: VAL ENDIF
<
< FORMAT DE 'DKMTCO' :
<
XWOR%1: VAL K
DO NIVMAX+Z
XWOR%1: VAL XWOR%1>BIT?BIT
XWOR%2: VAL CODBT=FMASK(K?XWOR%1=FCINST)XWOR%1
DKMLCO:: VAL XWOR%1>XWOR%2 < CHAMP DONNANT POUR CHAQUE NIVEAU DE
< GRIS L'INDICATION SUIVANTE : FAUT-IL
< MARQUER CE POINT SI NIVEAU EST PRESENT
< ANTERIEUREMENT (LE BIT DE RANG 'I' EST
< ASSOCIE AU NIVEAU DE RANG 'I')...
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
DKMPOI:: VAL MOCD < DEFINITION D'UNE PATTERN DE POINTILLES
< SUR 8 BITS ; CECI N'EST POSSIBLE QUE
< SI LA LUTTE ANTI-ALIASING EST MONO-
< DIMENSIONNELLE, ET CECI POUR DES RAISONS
< D'ENCOMBREMENT MEMOIRE...
IF DKMLCO(DKMPOI-K,,XEIF%,
IF ATTENTION : IL Y A UN RECOUVREMENT ENTRE LES
IF 2 CHAMPS 'DKMLCO' ET 'DKMPOI' !!!
XEIF%: VAL ENDIF
BDKMPO:: VAL BITSIG < BIT A TESTER SUR LA PATTERN CYCLIQUE
< 'MDKMPO' POUR SAVOIR SI L'ON TRACE (=0)
< OU PAS (=1) ; CES CONVENTIONS INVERSEES
< SONT CHOISIES POUR DES RAISONS DE COM-
< PATIBILITE ANTERIEURE...
XEIF%1: VAL ENDIF
<
< MODE DE TRACE :
<
DKMTSB:: VAL EXIST < MODE 'SBT',
DKMTRB:: VAL NEXIST < MODE 'RBT',
DKMTIB:: VAL -DKMTRB-DKMTSB < MODE 'IBT'.
<
< FORMAT DE 'DKMTMO' LORSQUE DES
< NIVEAUX DE GRIS SONT DEMANDES :
<
DKMSRI:: VAL MOCG < DONNE LE MODE DE TRACE (VOIR 'DKMTSB',
< 'DKMTRB'...).
DKMNIV:: VAL M000F < DONNE LE NIVEAU DE GRIS DEMANDE :
< ANTIAL : MODE ANTI-ALIASING,
< 0-NIVMAX : NIVEAU DE GRIS FORCE.
DKMDEC:: VAL M007F)DKMNIV < DONNE DE 0 A XNCOOL LE DECALAGE A
< DROITE A APPLIQUER AU NIVEAU ANTERIEUR
< DU POINT COURANT AVANT L'OPERATION
< LOGIQUE AVEC LE NOUVEAU NIVEAU...
DKBDEC:: VAL CODBT=FMASK(K?DKMDEC=FCINST)DKMDEC
< BIT DE 'DKMDEC' INDIQUANT S'IL EST
< NECESSAIRE DE TESTER A L'AIDE DE 'DKMLCO'
< LE NIVEAU ANTERIEUR DE CHAQUE POINT.
XWOR%2: VAL DKMDEC=K
XWOR%2: VAL -XWOR%2
XWOR%1: VAL CORBT?DKBDEC=FMASK(K?DKMDEC=FCINST>XWOR%2
IF XWOR%1-XNCOOL,,XEIF%,XEIF%
IF 'DKMDEC' EST TROP PETIT POUR CONTENIR UN DECALAGE
IF PERMETTANT DE MANIPULER 'XNIVMAX'+Z COULEURS, ET
IF LE BIT 'DKBDEC' !!!
XEIF%: VAL ENDIF
ANTIAL:: VAL NIVMAX+I < NIVEAU DE GRIS A DONNER POUR FORCER
< LE MODE ANTI-ALIASING.
DKMOBA:: VAL DKMSRI?DKMDEC?DKMNIV)MMOT
< INDIQUE OU DOIT SE FAIRE LE TRACE :
< 0 : DANS LA MEMOIRE UTILISATEUR,
< 1 : DANS 'MEMTV'.
<
< DISCRIMINATION LOGIQUE FLOUE
< ET LOGIQUE BINAIRE :
<
XWOR%1: VAL DKMSRI=K
XWOR%2: VAL NBITMO-B-XWOR%1 < DERNIER BIT DU CHAMP 'DKMSRI',
DKLOGD:: VAL XWOR%2-I < BIT ARGUMENT DISCRIMINATEUR DE LA LOGIQUE
< FLOUE ET DE LA LOGIQUE BINAIRE.
DKLOGF:: VAL DKLOGD-I < BIT DONNANT LA VALEUR DE 'DKLOGD' DANS
< LE CAS DE LA LOGIQUE FLOUE ; DONC :
< 'DKLOGD'='DKLOGF' ==> LOGIQUE FLOUE,
< 'DKLOGD'#'DKLOGF' ==> LOGIQUE BINAIRE.
DKLODD:: VAL DKLOGD+XWOR%1 < IDEM A 'DKLOGD', MAIS 'DKMSRI' ETANT
< CADRE A DROITE,
DKLODF:: VAL DKLOGF+XWOR%1 < DE MEME POUR 'DKLOGF'...
XWOR%3: VAL DKMTSB=K
XWOR%3: VAL NBITMO-B-XWOR%3 < DERNIER BIT DE 'DKMTSB'...
IF XWOR%3-DKLODD,,,XEIF%
IF ATTENTION : LA POSITION DE 'DKLOGD' EST MAUVAISE
IF SI L'ON VEUT UNE COMPATIBILTE AVEC LES VERSIONS
IF ANTERIEURES DE CMS5 ET DES PROGRAMMES !!!
XEIF%: VAL ENDIF
IF XWOR%3-DKLODF,,,XEIF%
IF ATTENTION : IDEM, 'DKLOGF' EST MAUVAIS !!!
XEIF%: VAL ENDIF
<
< DONNEES DE L'INTERPOLATION ((X1,Y1),(X2,Y2)) :
<
WORD NILK
DKMTDX:: VAL $-D-VARDKU < DELTAX=ABS(X2-X1).
WORD NILK
DKMTDY:: VAL $-D-VARDKU < DELTAY=ABS(Y2-Y1).
DKMTDF:: VAL $-VARDKU < DELTAX EXPRIME EN FLOTTANT...
FLOAT 0 : FORTE PENTE (ANGLE > PI/4),
< <0 : DROITE VERTICALE.
WORD INFINI
DKMINF:: VAL $-D-VARDKU < RELAI D'ACCES A 'INFINI' ; EN EFFET LA
< BASE 'C' EST MAUVAISE LORS DE L'INTER-
< POLATION, QU'EST-CE QU'IL NE FAUT PAS
< FAIRE !!!
WORD NILK
DKMRNA:: VAL $-D-VARDKU < CE MOT EST A LA FOIS ARGUMENT ET RESUL-
< TAT DE 'DKMTP1' :
< 1 - ARGUMENT :
< =0 : TRACER LE POINT ARGUMENT,
< #0 : NE FAIRE QUE RECUPERER LE
< NIVEAU ANTERIEUR DU POINT.
< 2 - RESULTAT : IL DONNE LE NIVEAU ANTE-
< RIEUR DU POINT COURANT.
WORD NILK
DKPOIN:: VAL $-D-VARDKU < INDICATEUR UTILISE PAR 'DKMTP2' PERMET-
< TANT DE SAVOIR S'IL S'AGIT D'UN POINT
< (ISOLE OU D'EXTREMITE) OU PAS :
< #0 : POINT ISOLE,
< =0 : POINT D'UN VECTEUR.
< A T T E N T I O N : 'DKPOIN' EST UTILI-
< SE POUR TRANSMETTRE LE 'CODEM' ENTRE
< 'DKMTV1' ET 'DKMTV5' PUISQUE LA BASE
< 'W' NE POINTE PLUS LA DEMANDE COURANTE.
XEIF%1: VAL ENDIF
<
< SOUS-PROGRAMMES NECESSAIRES :
<
WORD DKMTV5
DKMTA5:: VAL $-D-VARDKU < RELAI VERS 'DKMTV5'.
WORD DKMTP1
DKMTA1:: VAL $-D-VARDKU < TRACE D'UN POINT DONNE PAR SES
< COORDONNEES ENTIERES,
WORD DKMTP2
DKMTA2:: VAL $-D-VARDKU < TRACE DU POINT COURANT DONNE PAR
< SES COORDONNEES FLOTTANTES.
WORD DKMTP4
DKMTA4:: VAL $-D-VARDKU < SOUS-PROGRAMME DE CHOIX DU NIVEAU DE
< GRIS D'UN POINT, ET DE SON TRACE.
WORD DKMTP3
DKMTA3:: VAL $-D-VARDKU < "ARRONDI" D'UN NOMBRE FLOTTANT...
WORD DKMTP6
DKMTA6:: VAL $-D-VARDKU < SOUS-PROGRAMME FAISANT UN 'LOAD' OU UN
< 'STORE' SUR UN MOT DE L'IMAGE, EN FONC-
< TION DE L'INDICATEUR 'DKMOBA'.
<
< CONSTANTES DEFINISSANT L'IMAGE :
<
XWOR%2: VAL XC256-Z
DKMTNC:: VAL XWOR%2 < NOMBRE DE COLONNES PAR LIGNE.
XWOR%2: VAL XC256/NBITMO
DKMTNM:: VAL XWOR%2 < NOMBRE DE MOTS MEMOIRE PAR LIGNE.
WORD XL256-Z
DKMTNL:: VAL $-D-VARDKU < NOMBRE DE LIGNES EN PARTANT DE 0
< SUR UNE IMAGE DE 'TV'.
XXDEDX:: VAL XXVD4/XC256=K < REDUCTION SUR L'AXE DES 'X',
XXDEDY:: VAL XXVD4/XL256=K < REDUCTION SUR L'AXE DES 'Y'.
WORD NILK
DKMTRS:: VAL $-D-VARDKU < MODE 'SBT'/'RBT' DU TRACE...
WORD TVLIMA*LK*NOCMO
DKMLI1:: VAL $-D-VARDKU < LONGUEUR EN OCTETS D'UNE TRAME SIMPLE.
WORD TVLIMA*LK*XNCOOL+DKMTXY*NOCMO
DKMLI3:: VAL $-D-VARDKU < LONGUEUR EN OCTETS DES TRAMES AVEC
< INTERPOLATION AVEC NIVEAUX DE GRIS.
<
<
< Z O N E S P E C I F I Q U E D E T R A N S F E R T
< R A P I D E : ' D K U ' --> M E M T V :
<
<
XWOR%2: VAL NOCMO=K-DADR < POUR CONVERTIR AVEC DES PERTES DES
< ADRESSES DE LADR-MOTS EN ADRESSES
< D'OCTETS...
MEMTVQ:: VAL MEMTV0>XWOR%2
IF MEMTVQ-K,,XEIF%,
WORD MEMTVQ
DKMTM0:: VAL $-D-VARDKU < ADRESSE-OCTETS RELATIVES DE 'MEMTV0'.
XEIF%: VAL ENDIF
DKMTMR:: VAL MEMTVR>XWOR%2 < ADRESSE-OCTETS RELATIVE A 'MEMTV'
< DU PREMIER MOT INEXISTANT DANS LA
< MEMOIRE DE TAILLE 'RTLIMA'...
IF DKMTMR-K,,XEIF%,XEIF%
IF ATTENTION : LES TESTS FAITS A L'AIDE DE 'DKMTME'
IF SONT MAL PROGRAMMES !!!
XEIF%: VAL ENDIF
IF DKMTMR-K,,XEIF%,
WORD DKMTMR
DKMTME:: VAL $-D-VARDKU < ADRESSE OCTETS RELATIVE DE 'MEMTVR'.
XEIF%: VAL ENDIF
XWOR%1: VAL -DADR < POUR UN DECALAGE A GAUCHE...
IF MEMTVE-MEMTV0>XWOR%1-XXDK2,XEIF%,XEIF%,
IF ATTENTION : ON NE PEUT EN UNE SEULE OPERATION
IF ECHANGER LES 3 COMPOSANTES CHROMATIQUES !!!
XEIF%: VAL ENDIF
WORD DKM2
ADKM2:: VAL $-D-VARDKU < SORTIE IMMEDIATE LORSQUE LE SYSTEME
< DE TEEVISION EST ABSENT...
WORD ERDKM3
ADKM3:: VAL $-D-VARDKU < TRAITEMENT DES ERREURS DES TRANSFERTS
< RAPIDES...
<
< DONNEES DE TRANSFERT ENTRELACE DES TRAMES :
<
XLBKTV:: VAL 16 < ON CHOISIT DES BLOCS RELATIVEMENT PETITS.
XWOR%1: VAL XLBKTV=K
IF BIT>XWOR%1-XLBKTV,,XEIF%,
IF ATTENTION : 'XLBKTV' AFIN DE DIVISER LA LONGUEUR
IF DES TRAMES DOIT ETRE DE PREFERENCE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
ALBKTV: WORD XLBKTV
DKMLBK:: VAL $-D-VARDKU < LONGUEUR DES BLOCS DE MOTS INSEPARA-
< BLES DANS LES TRAMES DE CHAQUE COU-
< LEUR PRIMAIRE...
WORD LINHIB
ALINHI:: VAL $-D-VARDKU < RELAI D'ACCES A LA LISTE DES AUTORISA-
< TIONS/INHIBITIONS DES BLOCS ENTRELACES ;
< LE BIT D'INDEXATION SIGNIFIE :
< BITX=0 : CE DISPOSITIF EST IGNORE (AFIN
< D'OPTIMISER LES TRANSFERTS) ;
< REMARQUONS QUE DANS CE CAS,
< TOUS LES BLOCS SONT AUTORISES.
< BITX=1 : CE DISPOSITIF EST ACTIF...
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< CONSTANTE D'EXCES OU DE DEFAUT :
< (ELLE EST MISE ICI, EN BOUT DE 'DCTDKU',
< DE FACON A ECONOMISER UN MOT AU NIVEAU
< DE L'ADRESSAGE A L'AIDE DE LA BASE 'L' ;
< EN EFFET, SEUL LE PREMIER MOT D'UN
< NOMBRE FLOTTANT SE DOIT D'ETRE ADRES-
< SABLE)
<
DKMT05:: VAL $-VARDKU < CONSTANTE D'EXCES OU DE DEFAUT...
FLOAT XWOR%6-XXLTV,,XEIF%,
IF ATTENTION : LA LONGUEUR DE LA ZONE D'ENTRELACAGE DES
IF IMAGES EST INSUFFISANTE !!!
XEIF%: VAL ENDIF
CP ARGDEM+CODEM < L'IMAGE EST-ELLE COMPLETE ???
JNE DKUTT7 < NON, DONC PAS D'ENTRELACAGE...
CPZ ARGDEM+AMDEM < EST-CE BIEN 'MEMTV0' QUI EST CONCERNEE
< PAR CET ECHANGE ???
JNE DKUTT7 < NON, OU BIEN ELLE EST DECALEE ; ON REFUSE
< L'ENTRELACAGE...
IF MEMTVQ-K,,XEIF%,
IF ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%: VAL ENDIF
PSR W
CALL #SISP CMS5 W ZERO#
< (W)=BASE LA MEMOIRE DEBANALISEE :
LA TVENTR-ZERO,W < (A)=ADRESSE-MOT DE LA ZONE D'ENTRELACAGE,
PLR W
STA ARGDEM+AMDEM < ET ON MODIFIE 'AMDEM' QUI DESIGNE DESOR-
< MAIS LA ZONE D'ENTRELACAGE ; ON POURRA
< REGENERER 'AMDEM' EN SORTIE PUISQU'IL
< NUL A L'ENTREE...
LA NSPTYP
SBT TYPAD < ET IL FAUT FAIRE CROIRE QU'UNE ADRESSE
STA NSPTYP < A ETE FOURNIE...
DKUTT7: EQU $
<
< TRAITEMENT COMMUN 'FONTVR'/'FONTVW' :
<
<*******************************************************************************
DKMTQ3: LX VAR+LSDK < (X)=LISTE DES GROUPES APPROPRIES...
XWOR%1: VAL '0000000@@@@ < RECUPERATION DU 'LX LSDK'...
<*******************************************************************************
LXLSDK: EQU ZERO+XWOR%1 < AFIN D'UTILISER CETTE INSTRUCTION
< DANS 'HDLSCH' EN REFERENCE EN AVANT...
$EQU DKMTQ3 < ET ANNULATION DU CODE GENERE...
DKUTT6: EQU $
LA NSPTYP
TBT VBOX < LA DEMANDE COURANTE A-T'ELLE UNE 'BOX' ?
JNC DKMTQ2 < NON, PAS DE TEST DE BLOCAGE...
LA BOX < OUI :
EOR VAR+LSDK < ON FAIT UN .EOR. ENTRE LA LISTE DES
< APPROPRIATIONS PARTIELLES ('BOX') ET
< LA LISTE DES APPROPRIATIONS GENERALES
< ('LSDK') :
TBT BLDKTV < ON TESTE LE DERNIER GROUPE DE CYLINDRES
< QUI PROTEGE AUSSI L'ACCES A 'MEMTV' :
JC DKUTT5 < ERREUR, L'ACCES EST INTERDIT POUR CE
< DEMANDEUR : BOX=0 ET LSDK=1 (L'AUTRE
< CONFIGURATION DE BITS (1 ET 0) ETANT
< IMPOSSIBLE...
DKMTQ2: EQU $ < PAS DE TEST NECESSAIRE, OU BIEN
< (BOX)=LSDK : ACCES LIBRE (=0), OU BIEN
< RESERVE A CE DEMANDEUR (=1)...
LA ETASYS < OUI,
TBT TVEXIS < ALORS LA 'TV' EXISTE-T'ELLE ???
JC DKUTT3 < OUI, C'EST BON...
BR VAR+ADKM2 < NON, ON FAIT UNE SORTIE IMMEDIATE...
DKUTT3: EQU $
<
< NOTA IMPORTANT :
< ON NE FAIT PLUS L'OPERATION
< SUIVANTE :
< DSYNC0 <-- (DSYNC0).OR.'XEXATV'
< CAR EN EFFET, (SLO,SLE) SONT
< POSITIONNES DE FACON A ENCADRER
< LA 'CDA' COURANTE DE L'UTILISATEUR
< DEMANDEUR...
<
LA NSPTYP
TBT TYPAD < TYPE DE 'AMDEM' ???
JC DKUTT2 < DE MOTS, IL S'AGIT DONC DE L'ENTRELACAGE,
< ON NE FAIT DONC AUCUNE VERIFICATION, NI
< AUCUNE TRANSLATION...
LA ARGDEM+AMDEM < ADRESSE RELATIVE A 'MEMTV' DESIREE...
IF DKMTMR-K,,XEIF%,
JAL DKUTT5 < ERREUR...
XEIF%: VAL ENDIF
IF MEMTVQ-K,,XEIF%,
AD VAR+DKMTM0 < ON TRANSLATE,
STA ARGDEM+AMDEM < ET ON MODIFIE 'AMDEM' !!!
XEIF%: VAL ENDIF
IF DKMTMR-K,,XEIF%,
AD ARGDEM+CODEM < ADRESSE DU PREMIER MOT NON ECHANGE,
CP VAR+DKMTME < VALIDATION...
JG DKUTT5 < ERREUR, VIOLATION...
XEIF%: VAL ENDIF
DKUTT2: EQU $
<
< VERS LE TRAITEMENT DE L'ECHANGE :
<
LRM A
WORD DKM50 < (A)=ADRESSE DE TRAITEMENT DE L'ECHANGE.
PSR A < CETTE METHODE ME PERMET DE GAGNER UN MOT
< DANS LA 'DCTDKU'...
RSR < VERS LE TRAITEMENT DE L'ECHANGE...
<
< SORTIE EN ERREUR :
<
DKUTT5: EQU $
BR VAR+ADKM3
PAGE
<
<
< T R A C E D U P O I N T ( X 1 , Y 1 ) :
<
<
< ARGUMENT :
< DKMTX1,DKMTY1=COORDONNEES ENTIERES DU POINT A TRACER.
< DKMRNA=0 : TRACER LE POINT ARGUMENT,
< #0 : RENVOYER UNIQUEMENT LE NIVEAU ANTERIEUR
< DU POINT COURANT.
<
<
< RESULTAT :
< DKMRNA=NIVEAU ANTERIEUR DU POINT DANS TOUS LES CAS.
<
<
DKMTP1: EQU $
PSR A,B,X < SAUVEGARDES.
PSR C,W
<
< LE POINT (X1,Y1) EST-IL DANS L'ECRAN ???
<
LA DKMTX1-DEPCS,C < COORDONNEE X1 :
JAL AKMTV9 < HORS-ECRAN...
CPI DKMTNC < ???
JG AKMTV9 < HORS-ECRAN...
LA DKMTY1-DEPCS,C < COORDONNEE Y1 :
JAL AKMTV9 < HORS-ECRAN...
CP VAR+DKMTNL < ???
JG AKMTV9 < HORS-ECRAN...
<
< CAS OU LE POINT (X1,Y1) EST VISIBLE :
<
LR C,X < 'X' SERT A TRANSFERER UNE ADRESSE :
ADRI DKMTXY-DEPCS,X < (X)=ADRESSE DE L'IMAGE OU METTRE LE POINT
LR X,W < 'W' MEMORISE L'ADRESSE DE L'IMAGE, AFIN
< DE POUVOIR RECUPERER ULTERIEUREMENT
< L'INDICATEUR 'DKMOBA', ET DANS LA CAS DE
< 'MEMTV' L'ADRESSE RELATIVE D'UN MOT
< DANS L'IMAGE.
XWOR%1: VAL DKMTNM=K
IF BIT>XWOR%1-DKMTNM,,XEIF%,
IF ATTENTION : POUR QUE CE QUI SUIT FONCTIONNE
IF CORRECTEMENT, 'DKMTNM' DOIT ETRE UNE
IF PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
SLLS XWOR%1 < ON MULTIPLIE PAR LE NOMBRE DE MOTS PAR
< LIGNE.
ADR A,X
LA DKMTX1-DEPCS,C < (A)=COORDONNEE 'X',
SLRS NBITMO=K < QUE L'ON CONVERTIT EN ADRESSE-MOTS.
ADR A,X
LAI NBITMO-N
XWOR%1: VAL NBITMO=K
IF BIT>XWOR%1-NBITMO,,XEIF%,
IF ATTENTION : 'NBITMO' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
AND DKMTX1-DEPCS,C < NUMERO BIT DANS LE MOT.
LR X,C < (C)=ADRESSE DU MOT DANS L'IMAGE CONTE-
< NANT LE POINT A TRACER.
LR A,X
CPZ VAR+DKNIVO < AVEC OU SANS NIVEAU DE GRIS ???
JL DKMTW5 < SANS...
<
< CAS DU TRACE AVEC NIVEAU DE GRIS :
<
PSR Y
LRM Y
WORD TVLIMA*LK < CONSTANTE DE PASSAGE D'UNE TRAME
< A L'AUTRE...
IF DKMTSB-K,,,XEIF%
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
IF DKMTRB-K,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
IF DKMTIB-K,XEIF%,,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
<
< DETERMINATION DU NIVEAU COURANT DU POINT :
<
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA PREMIERE COMPOSANTE :
<*******************************************************************************
SCLS BIT,X
SLRD BIT < MEMORISATION DU PREMIER BIT (ROUGE).
ADR Y,C
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA DEUXIEME COMPOSANTE :
<*******************************************************************************
SCLS BIT,X
SLRD BIT < MEMORISATION DU DEUXIEME BIT (VERT).
ADR Y,C
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA TROISIEME COMPOSANTE :
<*******************************************************************************
SCLS BIT,X
ANDI BIT < MEMORISATION DU TROISIEME BIT (BLEU).
SLLD XNCOOL-BIT < (A)=NIVEAU COURANT DU POINT...
< SOIT : (A)=NC.
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< RENVOI DU NIVEAU ANTERIEUR :
<
CPZ VAR+DKMRNA < ALORS FAUT-IL TRACER LE POINT (=0), OU
< UNIQUEMENT RENVOYER SON NIVEAU ANTE-
< RIEUR ???
STA VAR+DKMRNA < DANS TOUS LES CAS, ON LE RENVOIE...
JNE DKMTWL < ET OUI, C'EST CE QUI ETAIT DEMANDE...
<
< ET NON, TRACE DU POINT :
<
XEIF%1: VAL ENDIF
<
< TEST DU NIVEAU ANTERIEUR 'NC' :
<
PSR X
LX VAR+DKDECA < (X)=DECALAGE A APPLIQUER AU NIVEAU 'NC',
XR A,X < (A)=DECALAGE A APPLIQUER,
< (X)='NC',
TBT DKMDEC=DKBDEC < ALORS, FAUT-IL TESTE LE NIVEAU
< ANTERIEUR 'NC' ???
JNC DKMTWK < NON, ON Y VA POUR LE MARQUAGE...
LA VAR+DKTCO < OUI, ALORS, ACCEDONS AU CHAMP 'DKMLCO' :
TBT CODBT=FMASK(K?DKMLCO=FCINST)DKMLCO+L,X
JNC DKMTWM < OK, LE BIT ASSOCIE AU NIVEAU 'NC' EST
< A 0, LE POINT COURANT, SI LA SUITE LE
< JUGE NECESSAIRE, PEUT ETRE MARQUE...
PLR X < ET BIEN NON, LE POINT COURANT DE NIVEAU
< 'NC' DOIT RESTER INTACT, CAR LE BIT DE
< RANG 'NC' DANS 'DKMLCO' EST A 1...
JMP DKMTWL < VERS LA SORTIE...
DKMTWM: EQU $
LA VAR+DKDECA < RESTAURATION DE (A)='DKDECA',
XWOR%2: VAL DKMDEC=K
XWOR%2: VAL -XWOR%2
XWOR%1: VAL CORBT?DKBDEC=FMASK(K?DKMDEC=FCINST>XWOR%2
ANDI XWOR%1 < (A)=DECALAGE A APPORTER A 'NC'...
DKMTWK: EQU $
XR A,X < RESTAURE :
< (A)='NC',
< (X)=DECALAGE A APPLIQUER A 'NC'...
SLRS L,X < ON DECALE LE NIVEAU COURANT DU POINT
< COURANT, QUITTE A LE FAIRE DISPARAITRE...
< (NC) DECALE EST ENCORE APPELE 'NC'...
PLR X
LB VAR+DKNIVO < (B)=NIVEAU DEMANDE,
< SOIT : (B)=N.
<
< DISCRIMINATION ENTRE LES 2 LOGIQUES :
<
PSR A,X
LA VAR+DKMTRS < (A)=MODE DEMANDE :
LXI K < (X)=DISCRIMINATEUR DES LOGIQUES,
TBT DKLODD
ADCR X
TBT DKLODF
SBCR X < (X)=0 : 'DKLODD'='DKLODF' ==> LOGIQUE
< FLOUE...
< (X)#0 : 'DKLODD'#'DKLODF' ==> LOGIQUE
< BINAIRE...
CPZR X < ALORS QUELLE EST LA LOGIQUE DEMANDEE ???
< (A NOTER QUE 'DKLOGD'='DKLOGF' EST
< COMPATIBLE AVEC L'ANCIENNE VERSION...)
PLR A,X
JE DKMTZ1 < CAS DE LA LOGIQUE FLOUE...
<
<
< L O G I Q U E B I N A I R E :
<
<
PSR A < SAUVEGARDE DU NIVEAU ANTERIEUR...
LA VAR+DKMTRS < (A)=MODE DEMANDE EN LOGIQUE BINAIRE,
IBT DKLODD < ET ON SE RAMENE AU FLOU...
CPI NEXIST < ALORS QUEL EST L'OPERATEUR ???
PLR A < (A)=NIVEAU ANTERIEUR...
IF DKMTSB-K,,,XEIF%
IF ATTENTION : 'DKMTSB' DOIT ETRE POSITIF !!!
XEIF%: VAL ENDIF
IF DKMTRB-K,,XEIF%,
IF ATTENTION : 'DKMTRB' DOIT ETRE NUL !!!
XEIF%: VAL ENDIF
IF DKMTIB-K,XEIF%,,
IF ATTENTION : 'DKMTIB' DOIT ETRE NEGATIF !!!
XEIF%: VAL ENDIF
IF NEXIST-K,,XEIF%,
IF ATTENTION : LES BRANCHEMENTS QUI SUIVENT SON IDIOTS !!!
XEIF%: VAL ENDIF
JG DKMTZ7 < CAS DE .OR. LOGIQUE...
JE DKMTZ6 < CAS DE .AND. LOGIQUE...
<
< .EOR. LOGIQUE :
<
EORR B,A < (A)=(A).EOR.(B),
JMP DKMTWD < VERS L'ECRITURE DANS L'IMAGE...
<
< .OR. LOGIQUE :
<
DKMTZ7: EQU $
ORR B,A < (A)=(A).OR.(B),
JMP DKMTWD < VERS L'ECRITURE DANS L'IMAGE...
<
< .AND. LOGIQUE :
<
DKMTZ6: EQU $
ANDR B,A < (A)=(A).AND.(B),
JMP DKMTWD < VERS L'ECRITURE DANS L'IMAGE...
AKMTV9: JMP DKMTV9 < RELAI...
<
<
< L O G I Q U E F L O U E :
<
<
DKMTZ1: EQU $
CPZ VAR+DKMTRS < QUEL EST LE MODE DU TRACE ???
JG DKMTW7 < 'SBT' : C'EST L'OPERATEUR .OR.
JE DKMTW6 < 'RBT' : C'EST L'OPERATEUR .AND.
<
< 'IBT' FLOU : C'EST L'OPERATEUR .EOR. FLOU :
<
PSR X,Y
LXI NIVMAX
SBR A,X < (X)=.NOT.(A)=.NOT.(NC), QUE L'ON VA
< NOTER NA...
LYI NIVMAX
SBR B,Y < (Y)=.NOT.(B)=.NOT.(N), QUE L'ON VA
< NOTER NB...
CPR A,Y < CALCUL DE A.AND.NB :
JGE DKMTWI < 'A' EST DEJA LE 'MIN'...
LR Y,A < C'EST 'Y' LE MIN...
DKMTWI: EQU $
CPR B,X < CALCUL DE B.AND.NA :
JGE DKMTWJ < 'B' EST DEJA LE 'MIN'...
LR X,B < C'EST 'X' LE MIN...
DKMTWJ: EQU $
PLR X,Y
JMP DKMTW7 < MAINTENANT, ON VA CALCULER :
< (A.AND.NB).OR.(NA.AND.B), C'EST-A-DIRE
< QUE L'ON EQUIVAUT MAINTENANT A 'SBT'...
<
< 'RBT' : C'EST L'OPERATEUR .AND. FLOU :
<
DKMTW6: EQU $
CPR A,B < CALCUL DE (A).AND.(B) :
JGE DKMTWD < 'A' EST DEJA LE 'MIN'...
JMP DKMTWH < C'EST 'B' LE 'MIN'...
<
< 'SBT' : C'EST L'OPERATEUR .OR. FLOU :
<
DKMTW7: EQU $
CPR A,B < CALCUL DE (A).OR.(B) :
JLE DKMTWD < 'A' EST DEJA LE 'MAX'...
DKMTWH: EQU $
LR B,A < C'EST 'B' LE 'MAX'...
<
< MISE EN PLACE DU NOUVEAU NIVEAU DU POINT COURANT :
<
DKMTWD: EQU $
SLRD XNCOOL < MISE DU NIVEAU DANS 'B'...
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA TROISIEME COMPOSANTE :
XLAOC:: VAL '0000000@@@@ < CODE DU 'LA O,C'...
<*******************************************************************************
SCLS L,X
SLLD BIT < CONCATENATION DU TROISIEME BIT (BLEU).
SCRS BIT,X
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
STA O,C
XSTAOC:: VAL '0000000@@@@ < CODE DU 'STA O,C'...
<*******************************************************************************
SBR Y,C
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA DEUXIEME COMPOSANTE :
<*******************************************************************************
SCLS L,X
SLLD BIT < CONCATENATION DU DEUXIEME BIT (VERT).
SCRS BIT,X
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
STA O,C
<*******************************************************************************
SBR Y,C
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
LA O,C < ACCES A LA PREMIERE COMPOSANTE :
<*******************************************************************************
SCLS L,X
SLLD BIT < CONCATENATION DU PREMIER BIT (ROUGE).
SCRS BIT,X
<*******************************************************************************
BSR VAR+DKMTA6 < EXECUTION DE CE QUI SUIT :
STA O,C
<*******************************************************************************
DKMTWL: EQU $
PLR Y
JMP DKMTV9 < VERS LA SORTIE...
<
< CAS DU TRACE SANS NIVEAU DE GRIS :
<
DKMTW5: EQU $
LA O,C
IF DKMTSB-K,,,XEIF%
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
IF DKMTRB-K,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
IF DKMTIB-K,XEIF%,,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ VAR+DKMTRS < QUE LE MODE 'SBT'/'RBT' ???
JE DKMTV3 < 'RBT'...
JL DKMTW1 < 'IBT'...
SBT L,X < 'SBT'.
JMP DKMTV4 < VERS LA MISE A JOUR DE L'IMAGE...
DKMTW1: EQU $
IBT L,X < 'IBT'.
JMP DKMTV4 < VERS LA MISE A JOUR DE L'IMAGE...
DKMTV3: EQU $
RBT L,X < 'RBT'.
DKMTV4: EQU $
STA O,C
DKMTV9: EQU $ < CAS DES OVER-SCREEN...
PLR C,W
PLR A,B,X < RESTAURATIONS.
RSR
PAGE
<
<
< A C C E S A U N M O T D E L ' I M A G E :
<
<
< FONCTION :
< CE SOUS-PROGRAMME EST TRES COMPLIQUE
< PARCEQU'IL N'Y A PLUS DE PLACE DANS LA
< 'DCTDKU', ET QU'ON NE PEUT DONC PAS FAIRE
< UN SOUS-PROGRAMME DE 'LOAD' ET UN SOUS-
< PROGRAMME DE 'STORE'. DE PLUS IL PREND
< EN COMPTE L'INDICATEUR 'DKMOBA' QUI
< INDIQUE SI L'OPERATION A LIEU DANS LA
< MEMOIRE UTILISATEUR, OU BIEN DANS
< 'MEMTV'...
<
<
< ARGUMENT :
< (W)=ADRESSE DE L'IMAGE DANS L'ESPACE BAS.
< (A)=VALEUR A FORCER S'IL S'AGIT D'UN 'STORE',
< L'INSTRUCTION SUIVANT LE 'BSR'.
<
<
< RESULTAT :
< (A)=VALEUR RECUPEREE S'IL S'AGIT D'UN 'LOAD'.
<
<
DKMTP6: EQU $
XKREG: VAL K
#@PSR X,Y,W < #SISP CMS5 KREG#
#@PSR A,B < #SISP CMS5 KREG#
XKREG: VAL -XKREG < NOMBRE DE REGISTRES EMPILES A L'ENTREE.
XWOR%2: VAL D < LONGUEUR D'UNE INSTRUCTION...
LA -DKMTXY+DKMTMO,W
ANDI DKMOBA < 'A' : DISCRIMINE LES DEMANDES EN MEMOIRE
< BASSSE (=0) DES DEMANDES 'MEMTV' (#0).
JANE DKMTVG < CAS DE 'MEMTV'...
<
< CAS DE LA MEMOIRE UTILISATEUR :
<
PLR A,B < RESTAURATION DE 'A' EN PARTICULIER...
< L'INSTRUCTION ARGUMENT SERA EXECUTEE AU
< RETOUR DU 'BSR'...
<
< SORTIE :
<
DKMTVH: EQU $
PLR X,Y,W
RSR
<
< CAS DE LA MEMOIRE 'MEMTV' :
<
DKMTVG: EQU $
SBR C,W < 'W' DONNAIT L'ADRESSE ABSOLUE DE LA
< MEMOIRE DE L'IMAGE UTILISATEUR, ET
< 'C' L'ADRESSE ABSOLUE D'UN MOT PARTI-
< CULIER DEDANS,
NGR W,Y < (Y)=ADRESSE RELATIVE DU MOT ADRESSE
< DANS 'MEMTV'.
LR K,W < 'W' BASE LA PILE :
LA -XKREG-XWOR%2+DEPILE,W
< (A)=REGISTRE 'P' DE RETOUR D'UN 'BSR'
< EXECUTE "NORMALEMENT"...
DO XWOR%2
IC -XKREG-XWOR%2+DEPILE,W
< AFIN DE SAUTER L'INSTRUCTION ARGUMENT...
LR A,W < 'W' BASE L'INSTRUCTION ARGUMENT,
LX O,W < (X)=INSTRUCTION ARGUMENT, QUI SUIT LE
< 'BSR' D'APPEL.
LRM A,B
WORD XLAOC < (A)=CODE DU 'LA O,C',
WORD XSTAOC < (B)=CODE DU 'STA O,C'.
CPR A,X < EST-CE UN 'LOAD' ???
JE DKMTVI < OUI...
CPR B,X < EST-CE UN 'STORE' ???
JE DKMTVJ < OUI...
PSR C < NON,
CALL #SISP CMS5 BASE C#
< QU'EST-CE QU'IL NE FAUT PAS FAIRE ?!???!
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VOIR POURQUOI LE REGISTRE 'X' EST
< MAUVAIS !!!
<
PLR C
PLR A,B
JMP DKMTVH < ET ON ABANDONNE...
<
< CAS D'UN 'LOAD' DANS 'MEMTV' :
<
DKMTVI: EQU $
PLR A,B < RESTAURATION DE 'A' EN PARTICULIER...
LAR < ACCES AU MOT DEMANDE...
JMP DKMTVH < ET ON SORT...
<
< CAS D'UN 'STORE' DANS 'MEMTV' :
<
DKMTVJ: EQU $
PLR A,B < RESTAURATION DE 'A' EN PARTICULIER...
STAR < ET RANGEMENT DU MOT ARGUMENT...
JMP DKMTVH < ET ON SORT...
PAGE
<
<
< C A L C U L D U N I V E A U D E G R I S
< E T T R A C E D U P O I N T :
<
<
< FONCTION :
< CE SOUS-PROGRAMME CALCULE LA DISTANCE
< DU POINT ENTIER COURANT (X,Y)
< AU POINT FLOTTANT COURANT (DKMTX,DKMTY)
< SUIVANT LA NORME EUCLIDIENNE ;
< A PARTIR DE CETTE DISTANCE, ON EN DEDUIT
< UN NIVEAU DE GRIS : PLUS LE POINT ENTIER
< EST PRES DU POINT FLOTTANT, PLUS IL EST
< LUMINEUX...
<
<
< ARGUMENTS :
< (DKMTX,DKMTY)=COORDONNEES DU POINT FLOTTANT,
< (X,Y)=COORDONNEES DU POINT ENTIER.
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
< (FPENTE)=COEFFICIENT (ENTRE 0 ET 1) DE PONDE-
< RATION DES NIVEAUX...
XEIF%1: VAL ENDIF
<
<
DKMTP4: EQU $
PSR A,B
IF DIMALI-DIMAL1,XEIF%2,,XEIF%2
STX DKMTX1-DEPCS,C < ARGUMENT 'X' DE 'DKMTP1',
STY DKMTY1-DEPCS,C < ARGUMENT 'Y' DE 'DKMTP1'.
<
< INTERPOLATION AVEC
< LE NIVEAU ANTERIEUR :
<
STZ VAR+DKMRNA
IC VAR+DKMRNA < (DKMRNA)#0,
BSR VAR+DKMTA1 < RECUPERATION DU NIVEAU ANTERIEUR DU
< POINT ARGUMENT :
PSR X,Y < SAUVEGARDES...
FLD VAR+FPENTE < (A,B)=FPENTE ; A NOTER QUE LE CODE QUI
< SUIT EST VACHEMENT COMPLIQUE PAR LE FAIT
< QU'IL DEMANDERAIT EN FAIT DES VARIABLES
< FLOTTANTES DE MANOEUVRE, MAIS QUE LA
< 'DCTDKU' EST PLEINE COMME UN OEUF...
LR A,X
LR B,Y < (X,Y)=FPENTE,
LAI I
FLT
FSB VAR+FPENTE
FST VAR+FPENTE < MEMORISATION PENIBLE DE 1-FPENTE...
LA VAR+DKMRNA < (A)=NIVEAU ANTERIEUR DU POINT COURANT,
FLT < QUE L'ON FLOTTE...
FMP VAR+FPENTE < NA*(1-FPENTE), EN APPELANT "NA" LE
< NIVEAU ANTERIEUR...
FST VAR+FPENTE < ET MEMORISATION PENIBLE...
LR X,A < (X,Y)=FPENTE,
LR Y,B < (A,B)=FPENTE,
FMP VAR+FIVMAX < FIVMAX*FPENTE,
PSR A,B < ET SAUVEGARDE...
BSR VAR+DKMTA3 < (A)=NIVEAU ENTIER QUE L'ON OBTIENDRAIT
< SI L'ON INTERPOLAIT ENTRE LE NIVEAU
< NUL (NOIR) ET LE MAX...
CP VAR+DKMRNA < EST-IL EGAL A CELUI QUI ETAIT PRESENT
< ANTERIEUREMENT ???
PLR A,B < RESTAURATION...
JE DKMTWN < OUI, C'EST LUI QU'ON PREND ; NOTONS
< QU'ON N'A PAS BESOIN DE LE TRACER, MAIS
< CELA SIMPLIFIE LA GESTION DE LA PILE...
< C'EST EN PARTICULIER LE CAS OU L'ON
< TRACE DE FOIS DE SUITE LE MEME TRAIT :
< SANS CE DISPOSITIF, ON CUMULE LES 2 TRACE
< ET L'ANTI-ALIASING S'AMENUISE...
FAD VAR+FPENTE < NON, NA*(1-FPENTE)+FIVMAX*FPENTE, SOIT UN
< VALEUR INTERPOLEE ENTRE LE NIVEAU ANTE-
< RIEUR "NA", ET LE NIVEAU MAXIMAL...
DKMTWN: EQU $
XR A,X
XR B,Y < (A,B)=FPENTE, ET
< (X,Y)=NA*(1-FPENTE)+FIVMAX*FPENTE.
FST VAR+FPENTE < ET ON RESTAURE 'FPENTE', ENFIN...
LR X,A
LR Y,B < (A,B)=NIVEAU INTERPOLE DANS (NA,FIVMAX),
PLR X,Y < ET ON RESTAURE...
XEIF%2: VAL ENDIF
IF DIMALI-DIMAL2,XEIF%2,,XEIF%2
LR X,A < (X)=A=COORDONNEE X ENTIERE,
STA DKMTX1-DEPCS,C < ARGUMENT DE 'DKMTP1'.
FLT
FSB VAR+DKMTX
FST VAR+FWORK
FMP VAR+FWORK
PSR A,B < SAUVEGARDE DE (X1-X)**2.
LR Y,A < (Y)=A=COORDONNEE Y ENTIERE,
STA DKMTY1-DEPCS,C < ARGUMENT DE 'DKMTP1'.
FLT
FSB VAR+DKMTY
FST VAR+FWORK
FMP VAR+FWORK
FST VAR+FWORK < SAUVEGARDE DE (Y1-Y)**2,
PLR A,B
FAD VAR+FWORK < CALCUL DE LA NORME EUCLIDIENNE AU CARRE,
< SOIT : D**2=(X1-X)**2+(Y1-Y)**2.
<
< CALCUL D'UNE RACINE CARREE :
< (PAR LA METHODE DE NEWTON
< U(N+1)=(U(N)+K/U(N))/2)
<
RAC: EQU $
FCAZ < LE CALCUL EST-IL NECESSAIRE ???
JE RAC2 < NON : NOMBRE=0 ==> RACINE=0...
JL DKMTWA < HORREUR, LE NOMBRE EST NEGATIF,
< E R R E U R S Y S T E M E...
< (NE PAS OUBLIER QUE 'C' EST MAUVAISE !!!)
PSR X,Y
LR A,X < X ET
LR B,Y < Y MEMORISENT LE NOMBRE ARGUMENT.
RAC1: EQU $
FST VAR+FWORK
LR X,A
LR Y,B < ('K' REPRESENTE LE NOMBRE DONT ON
< CALCULE LA RACINE CARREE ET QUI EST
< MEMORISE DANS (X,Y)).
FDV VAR+FWORK < K/U(N),
FAD VAR+FWORK < U(N)+K/U(N),
FMP VAR+DKMT05 < (U(N)+K/U(N))/2=(U(N)+K/U(N))*0.5.
FCAM VAR+FWORK < TEST DE FIN ???
JNE RAC1 < NON...
PLR X,Y
<
< CALCUL DU NIVEAU DU POINT :
<
RAC2: EQU $
FSB VAR+FRHUIT
FNEG
FDV VAR+FRHUIT < ON CALCULE (FRHUIT-D)/FRHUIT, OU
< 'FRHUIT' EST LA VALEUR MAXIMALE DE 'D'...
FMP VAR+FIVMAX < PONDERATION DE 'NIVMAX'...
XEIF%2: VAL ENDIF
BSR VAR+DKMTA3 < (A)=NIVEAU A ATTRIBUER AU POINT (X,Y).
JAL DKMTWA < ERREUR...
CPI NIVMAX < VALIDATION, SUITE...
JLE DKMTW3 < OK...
DKMTWA: EQU $
PSR C
CALL #SISP CMS5 BASE C#
< QU'EST-CE QU'IL NE FAUT PAS FAIRE ????!!!
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ESSAYER DE COMPRENDRE...
<
PLR C
NTRN
LAI NIVMAX/XXXMOY < POURQUOI PAS ???
TRN
DKMTW3: EQU $
STA VAR+DKNIVO < MEMORISATION DU NIVEAU...
IF DIMALI-DIMAL2,XEIF%2,,XEIF%2
CP VAR+DKMIVO < EST-IL MAXIMAL ???
JLE DKMTWB < NON...
STA VAR+DKMIVO < OUI, ON LE MEMORISE,
STX VAR+DKNIVX < AINSI QUE LES COORDONNEES 'X'
STY VAR+DKNIVY < ET 'Y' DU POINT ENTIER CORRESPONDANT.
DKMTWB: EQU $
XEIF%2: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
STZ VAR+DKMRNA < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
XEIF%1: VAL ENDIF
BSR VAR+DKMTA1 < ET TRACE DU POINT (DKMTX1,DKMTY1)
< AVEC LE NIVEAU 'DKNIVO'...
PLR A,B
RSR
PAGE
<
<
< T R A C E D U P O I N T C O U R A N T ( X , Y ) :
<
<
< ARGUMENT :
< DKMTX,DKMTY=COORDONNEES DU POINT A TRACER EN FLOTTANT.
<
<
DKMTP2: EQU $
PSR A,B,X,Y
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES :
<
LA VAR+MDKMPO < (A)=PATTERN COURANTE DES POINTILLES,
TBT BDKMPO < FAUT-IL TRACER LE POINT COURANT ???
JC AKMTZP < NON, ON SORT...
XEIF%1: VAL ENDIF
<
< INITIALISATIONS :
<
LX DKMTX1-DEPCS,C < SAUVER 'DKMTX1'...
LY DKMTY1-DEPCS,C < ... ET 'DKMTY1'.
CPZ VAR+DKNIVO < FAUT-IL DES NIVEAUX DE GRIS ???
JL DKMTW9 < NON...
LA DKMTMO-DEPCS,C < OUI,
ANDI DKMNIV < (A)=NIVEAU DE GRIS DEMANDE.
XWOR%1: VAL DKMNIV=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1
XEIF%: VAL ENDIF
CPI ANTIAL < EST-CE L'ANTI-ALIASING ???
JNE DKMTVD < NON, IL S'AGIT BIEN D'UN NIVEAU DE GRIS..
<
< CAS D'UN TRACE ANTI-ALIASING :
<
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
STZ VAR+DKMIVO < INITIALISATION DU NIVEAU MAXIMAL
DC VAR+DKMIVO < RENCONTRE SUR UNE VALEUR NEGATIVE...
XEIF%1: VAL ENDIF
PSR X,Y
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
LA &VAR+DKMINF < ACCES A 'INFINI'...
STA VAR+APENTE < DROITE VERTICALE A PRIORI...
FLD VAR+DKMT05
FST VAR+FPENTE < A PRIORI, ON SUPPOSE QU'IL S'AGIT DE
< DROITES VERTICALES OU HORIZONTALES, OU
< DE POINTS ISOLES OU D'EXTREMITES.
FLD VAR+DKMTA < (A,B)=PENTE FLOTTANTE,
FABS < DONT ON PREND LA VALEUR ABSOLUE,
FIX < PUIS LA VALEUR ENTIERE :
JV DKMTZK < DEBORDEMENT, ON CONSIDERE LA DROITE
< VERTICALE...
STA VAR+APENTE < OK, CET INDICATEUR PRECISE :
< =0 : FAIBLE PENTE,
< >0 : FORTE PENTE,
< <0 : DROITE VERTICALE.
DKMTZK: EQU $
PENT45:: VAL W/W < DEFINITION D'UNE PENTE A 45 DEGRE...
< NOTA IMPORTANT : ETANT DONNE L'INVER-
< SION DE L'AXE 'OY', LE REFERENTIEL
< N'EST PAS DIRECT : IL Y A SYMETRIE PAR
< RAPPORT A 'OX', ET ALORS TOUTES LES
< REFERENCES A 'PENT45' SERONT INVERSEES...
IF PENT45-K-I,,XEIF%,
IF ATTENTION : SI 'PENT45' NE VAUT PAS 1,
IF ON NE PEUT PAS DISTINGUER LES PENTES
IF FAIBLES (ANGLE INFERIEUR A PI/4) PAR
IF UN TEST DE NULLITE !!!
XEIF%: VAL ENDIF
XEIF%1: VAL ENDIF
<
< CALCUL DU "POINT CENTRAL" :
<
FLD VAR+DKMTX
FCAZ
JL DKMTWC < HORS-ECRAN : ON EVITE DE PLUS UN
< MECHANT PROBLEME LIE A L'INSTRUCTION
< 'FIX' QUI TRONQUE PAR EXCES LES
< NOMBRES NEGATIFS...
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
FIX
XEIF%1: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
CPZ VAR+APENTE < COMMENT EST-LA PENTE DE LA DROITE ???
JE DKMTZG < FAIBLE...
FIX < FORTE : LA COORDONNEE 'X' EST DONC LA
< PARTIE ENTIERE PAR DEFAUT DE LA
< VALEUR FLOTTANTE 'DKMTX'.
JMP DKMTZH
DKMTZG: EQU $
BSR VAR+DKMTA3 < FAIBLE : LA COORDONNEE 'X' EST OBTENUE
< PAR LA PLUS PROCHE VALEUR ENTIERE DE
< 'DKMTX' AFIN D'EVITER DES TROUS DANS
< LE TRACE...
DKMTZH: EQU $
XEIF%1: VAL ENDIF
LR A,X < (X)=COORDONNEE DU PREMIER POINT ENTIER.
< (DIT "POINT CENTRAL")
FLD VAR+DKMTY
FCAZ
JL DKMTWC < HORS-ECRAN...
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
FIX
XEIF%1: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
CPZ VAR+APENTE < COMMENT EST LA PENTE DE LA DROITE ???
JNE DKMTZI < FORTE (>0) OU VERTICALE (<0)...
FIX < FAIBLE : LA COORDONNEE 'Y' EST LA
< VALEUR ENTIERE PAR DEFAUT DE LA VALEUR
< FLOTTANTE 'DKMTY'.
JMP DKMTZJ
DKMTZI: EQU $
BSR VAR+DKMTA3 < FORTE : LA COORDONNEE 'Y' EST LA VALEUR
< ENTIERE LA PLUS PROCHE DE LA VALEUR
< FLOTTANTE 'DKMTY' AFIN D'EVITER DES
< TROUS...
DKMTZJ: EQU $
XEIF%1: VAL ENDIF
LR A,Y < (Y)=COORDONNEE DU PREMIER POINT ENTIER.
< (DIT "POINT CENTRAL")
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
<
< GESTION BI-DIMENSIONNELLE :
<
IF FRCOTE-I-I,,XEIF%,
IF FRCOTE-I-I-I-I,,XEIF%,
IF ATTENTION : 'FRCOTE' NE PEUT VALOIR QUE 2 OU 4 !!!
XEIF%: VAL ENDIF
BSR VAR+DKMTA4 < TRACE DU POINT (X,Y) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+1,Y) AVEC NIVEAU,
ADRI I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X+1,Y+1) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X,Y+1) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X-1,Y+1) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-1,Y) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-1,Y-1) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X,Y-1) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+1,Y-1) AVEC NIVEAU.
IF FRCOTE-I-I-I-I,XEIF%,,XEIF%,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+2,Y-1) AVEC NIVEAU,
ADRI I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X+2,Y) AVEC NIVEAU,
ADRI I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X+2,Y+1) AVEC NIVEAU,
ADRI I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X+2,Y+2) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+1,Y+2) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X,Y+2) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X-1,Y+2) AVEC NIVEAU,
ADRI -I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X-2,Y+2) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-2,Y+1) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-2,Y) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-2,Y-1) AVEC NIVEAU,
ADRI -I,Y
BSR VAR+DKMTA4 < TRACE DU POINT (X-2,Y-2) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X-1,Y-2) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X,Y-2) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+1,Y-2) AVEC NIVEAU,
ADRI I,X
BSR VAR+DKMTA4 < TRACE DU POINT (X+2,Y-2) AVEC NIVEAU.
ADRI I,Y
ADRI -I,X
XEIF%: VAL ENDIF
ADRI I,Y < RETOUR AU
ADRI -I,X < POINT CENTRAL...
LAI NIVMAX
STA VAR+DKNIVO < ON VA FORCER 'NIVMAX'
< EN UN POINT ENTIER ADAPTE A 'DELTAX'
< ET 'DELTAY'...
< (CE POINT SERA LE PLUS PROCHE POSSIBLE
< DU POINT "MAX" RENCONTRE...)
LX VAR+DKNIVX < 'X' A PRIORI...
LY VAR+DKNIVY < 'Y' A PRIORI...
STX DKMTX1-DEPCS,C
STY DKMTY1-DEPCS,C
BSR VAR+DKMTA1 < ET ON RE-TRACE CE POINT...
XEIF%1: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION MONO-DIMENSIONNELLE :
<
LAI NIVMAX
STA VAR+DKNIVO
STX DKMTX1-DEPCS,C
STY DKMTY1-DEPCS,C
STZ VAR+DKMRNA < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
BSR VAR+DKMTA1 < TRACE DU "POINT CENTRAL" (X,Y), AVEC
< LE NIVEAU MAXIMAL 'NIVMAX'...
<
< DISCRIMINATION SUIVANT LA
< PENTE DE LA DROITE :
<
FCMZ VAR+DKMTA < COMMENT EST LA DROITE ???
JE DKMTZO < HORIZONTALE, ON A DEJA : (FPENTE)=F05...
CPZ VAR+APENTE < COMMENT EST LA DROITE ???
JL DKMTZO < VERTICALE, ON A DEJA : (FPENTE)=F05...
JG DKMTZQ < LA DROITE A UNE FORTE PENTE SANS ETRE
< VERTICALE...
<
< CAS DES DROITES DE FAIBLE
< PENTE NON HORIZONTALE :
<
LR Y,A
FLT
FSB VAR+DKMTY
FABS
FST VAR+FPENTE < LA PENTE EST FAIBLE EN VALEUR ABSOLUE,
< ET ALORS :
< FPENTE=ABS(DKMTY-Y), C'EST-A-DIRE LA
< MESURE EN VALEUR ABSOLUE SUR L'AXE
< DES 'Y' DE LA DISTANCE DU POINT FLOTTANT
< AU POINT ENTIER...
< ATTENTION : L'AXE DES 'Y' EST DESCEN-
< DANT, ET 'Y' ENTIER PAR DEFAUT EST AU-
< DESSUS (SUR L'ECRAN) DU POINT FLOTTANT
< 'DKMTY' ; C'EST DONC EN FAIT 1-FPENTE
< QUE L'ON VIENT DE CALCULER, D'OU :
< (X,Y+1) <-- NIVMAX*FPENTE, ET
< (X,Y-1) <-- NIVMAX*(1-FPENTE) CI DESSOUS
< ET NON PAS L'INVERSE...
JMP DKMTZO
<
< CAS DES DROITES DE FORTE
< PENTE NON VERTICALE :
<
DKMTZQ: EQU $
LR X,A
FLT
FSB VAR+DKMTX
FABS
FST VAR+FPENTE < A PRIORI, ON SUPPOSE QUE LA PENTE DE
< DROITE VA ETRE FORTE EN VALEUR ABSOLUE,
< ET ALORS :
< FPENTE=ABS(DKMTX-X), C'EST-A-DIRE LA
< MESURE EN VALEUR ABSOLUE SUR L'AXE
< DES 'X' DE LA DISTANCE DU POINT FLOTTANT
< AU POINT ENTIER...
DKMTZO: EQU $
CPZ VAR+DKPOIN < EST-CE UN POINT ISOLE ???
JE DKMTZN < NON...
<
< CAS DES POINTS ISOLES :
<
ADRI I,Y
BSR VAR+DKMTA4 < (X,Y+1) <-- NIVMAX/2,
ADRI -I,X
BSR VAR+DKMTA4 < (X-1,Y+1) <-- NIVMAX/2,
ADRI -I,Y
BSR VAR+DKMTA4 < (X-1,Y) <-- NIVMAX/2,
ADRI -I,Y
BSR VAR+DKMTA4 < (X-1,Y-1) <-- NIVMAX/2,
ADRI I,X
BSR VAR+DKMTA4 < (X,Y-1) <-- NIVMAX/2,
ADRI I,X
BSR VAR+DKMTA4 < (X+1,Y-1) <-- NIVMAX/2,
ADRI I,Y
BSR VAR+DKMTA4 < (X+1,Y) <-- NIVMAX/2,
ADRI I,Y
JMP DKMTZM < POUR :
< (X+1,Y+1) <-- NIVMAX/2.
AKMTZP: JMP DKMTZP < RELAI...
<
< DISCRIMINATION DES PENTES :
<
DKMTZN: EQU $
IF PENT45-K-I,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ VAR+APENTE < COMMENT EST LA PENTE DE LA DROITE ???
JNE DKMTZC < FORTE (>0), OU VERTICALE (<0)...
<
< CAS DES FAIBLES PENTES :
<
ADRI I,Y
BSR VAR+DKMTA4 < (X,Y+1) <-- NIVMAX*FPENTE,
ADRI -I-I,Y
JMP DKMTZE < (X,Y-1) <-- NIVMAX*(1-FPENTE).
<
< CAS DES FORTES PENTES :
<
DKMTZC: EQU $
ADRI I,X
BSR VAR+DKMTA4 < (X+1,Y) <-- NIVMAX*FPENTE,
ADRI -I-I,X < POUR :
< (X-1,Y) <-- NIVMAX*(1-FPENTE).
<
< TRACE DU DEUXIEME POINT :
< (OU DU DERNIER POUR LES
< "POINTS ISOLES")
<
DKMTZE: EQU $
LAI I < PAS DE PASSAGE D'UN POINT A L'AUTRE...
FLT
FSB VAR+FPENTE
FST VAR+FPENTE < FPENTE=1-FPENTE...
DKMTZM: EQU $
BSR VAR+DKMTA4 < ET MARQUAGE DU DEUXIEME POINT SUIVANT
< LE CONTENU DES REGISTRES 'X' ET 'Y', ET
< AVEC LE NIVEAU NIVMAX*(1-FPENTE)...
XEIF%1: VAL ENDIF
DKMTWC: EQU $
PLR X,Y
JMP DKMTW8 < VERS LA SORTIE...
<
< CAS D'UN TRACE AVEC NIVEAU DE GRIS :
<
DKMTVD: EQU $
STA VAR+DKNIVO < ON MEMORISE LE NIVEAU DE GRIS DEMANDE ;
< CETTE OPERATION EST D'AILLEURS SUREMENT
< INUTILE, PUISQUE REALISEE AU DEBUT DE LA
< PHASE D'INTERPOLATION, MAIS...
<
< TRACE SANS NIVEAU DE GRIS :
<
DKMTW9: EQU $
FLD VAR+DKMTX < X COURANT FLOTTANT.
BSR VAR+DKMTA3 < QUE L'ON FIXE...
STA DKMTX1-DEPCS,C < X COURANT EN FIXE.
FLD VAR+DKMTY < Y COURANT FLOTTANT.
BSR VAR+DKMTA3 < QUE L'ON FIXE...
STA DKMTY1-DEPCS,C < Y COURANT EN FIXE.
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
STZ VAR+DKMRNA < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
XEIF%1: VAL ENDIF
BSR VAR+DKMTA1 < TRACE POINT.
DKMTW8: EQU $
STX DKMTX1-DEPCS,C < RESTAURATION 'DKMTX1'...
STY DKMTY1-DEPCS,C < ... ET 'DKMTY1'.
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES, ET RETOUR :
<
LA VAR+MDKMPO
DKMTZP: EQU $ < (A)=PATTERN COURANTE DES POINTILLES,
SCLS BIT < ON LA FAIT TOURNER,
STA VAR+MDKMPO < ET ON LA MEMORISE...
XEIF%1: VAL ENDIF
PLR A,B,X,Y
RSR
PAGE
<
<
< A R R O N D I D ' U N N O M B R E F L O T T A N T :
<
<
< ARGUMENT :
< (A,B)=NOMBRE FLOTTANT.
<
<
< RESULTAT :
< (A)=NOMBRE FLOTTANT ARGUMENT CONVERTI EN
< ENTIER PAR EXCES OU PAR DEFAUT SUIVANT
< LES CAS...
<
<
DKMTP3: EQU $
FCAZ < LE NOMBRE EST-IL POSITIF OU NEGATIF ???
JL DKMTWE < NEGATIF...
FAD VAR+DKMT05 < POSITIF : ARRONDI PAR ADDITION DE 0.5...
JMP DKMTWF < VERS LA CONVERSION ENTIERE...
DKMTWE: EQU $
FSB VAR+DKMT05 < NEGATIF : ARRONDI PAR SOUSTRACTION...
DKMTWF: EQU $
FIX < CONVERSION ENTIERE...
RSR
PAGE
<
<
< T R A N S F E R T S I M U L T A N E D E S T R O I S
< C O M P O S A N T E S E N E N T R E L A C A N T :
<
<
< FONCTION :
< CETTE FONCTION PERMET DE VISUALISER
< GLOBALEMENT LES 3 COMPOSANTES, ET CECI
< EN ENTRELACANT CES 3 DERNIERES ; A CETTE
< FIN, ON ENVOIE UN MOT ROUGE, PUIS UN MOT
< VERT, PUIS UN MOT BLEU, PUIS UN MOT ROUGE,...
< ON NE PEUT QUE REGRETTER QUE CETTE
< METHODE SOIT INAPPLIQUABLE LORS DES TRANSFERTS
< RAPIDES ENTRE 'DKU' ET 'MEMTV'...
<
<
DKUT50: EQU $
CPI -DKMTXY*NOCMO < LE 'CODEM' VALAIT-IL TVLIMA*LK*
< NOCMO*NCOOL ???
JNE DKUT8A < NON, ERREUR...
CPZR Y < OUI, Y-AVAIT-IL UN 'ASDEM' ???
JNE DKUT8A < OUI, ERREUR...
CALL #SISP CMS5 BASE C#
< C'EST-Y PAS MALHEUREUX MON BON
< MONSIEUR D'EN ARRIVER LA...
LA ETASYS < OUI,
TBT TVEXIS < MAIS LA TELEVISION EST-ELLE ACTIVE ???
JNC DKUT53 < NON, ON SORT IMMEDIATEMENT...
<
< OK, TRANSFERT ENTRELACE DES 3 COMPOSNTES :
<
ADRI -DKMTC,W < AINSI, 'W' BASE L'IMAGE...
CALL #SISP CMS5 PSRSLO#
< SAUVEGARDE DE 'SLO' ET 'SLE'...
LRM A,B,Y
WORD MEMTV0 < (A)=VALEUR DU FUTUR 'SLO',
WORD MEMTVE-Z < (B)=VALEUR DU FUTUR 'SLE',
WORD TVLIMA*LK < (Y)=LONGUEUR D'UNE TRAME=CONSTANTE DE
< PASSAGE D'UNE TRAME A L'AUTRE.
BSR VAR+ATWOED < ON INITIALISE 'SLO' ET 'SLE' SUR LA
< MEMOIRE DE VISUALISATION 'MEMTV'.
LR Y,A
SARD NBITMO < (A,B)=LONGUEUR D'UNE TRAME,
DV VAR+DKMLBK < (A)=NOMBRE DE BLOCS MONOCHROMATIQUES
< CONTENUS DANS UNE TRAME.
CPZR B < ET LE RESTE ???
JE DKUT56 < ET BIEN, IL EST NUL...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VERIFIER SI 'DKMLBK' A ETE MODIFIE,
< ET SI OUI, PAR QUI ???
<
DKUT56: EQU $
LR A,X < (X)=NOMBRE DE BLOCS PAR TRAME=NOMBRE DE
< XNCOOL-TRANSFERTS DE BLOCS...
LR W,A < (A)=ADRESSE DE DEBUT DE L'IMAGE A
< TRANSFERER=ADRESSE DE L'EMETTEUR,
LBI TVAR0 < (B)=ADRESSE RELATIVE A 'MEMTV' DE LA
< MEMOIRE DE VISUALISATION=ADRESSE DU
< RECEPTEUR.
<
< BOUCLE DE TRANSFERT DES 'XNCOOL' COMPOSANTES :
<
DKUT54: EQU $
PSR A,B,X
LXI XNCOOL < (X)=NOMBRE DE COMPOSANTES.
<
< BOUCLE DE TRANSFERT D'UN XNCOOL-BLOC :
<
DKUT55: EQU $
PSR X
LX VAR+DKMLBK < (X)=LONGUEUR D'UN BLOCS=NOMBRE DE MOTS
< A DEPLACER.
MVTS < ENVOI D'UN BLOC EN 'MEMTV',
ADR Y,A < PASSAGE AU BLOC EMETTEUR SUIVANT,
ADR Y,B < PASSAGE AU BLOC RECEPTEUR SUIVANT,
PLR X
JDX DKUT55 < S'IL EXISTE...
PLR A,B,X
AD VAR+DKMLBK < PROGRESSION DES EMETTEURS,
XR A,B
AD VAR+DKMLBK < ET DES RECPTEURS,
XR A,B
JDX DKUT54 < S'IL EN EXISTE...
<
< FIN DU PROCESSUS :
<
< RESTAURATION DE (SLO,SLE) :
CALL #SISP CMS5 PLRSLO#
DKUT53: EQU $
PLR B,Y,C,W
BR VAR+ADKM2 < VERS LA SORTIE...
PAGE
<
<
< T R A C E D U S E G M E N T ( ( X 1 , Y 1 ) , ( X 2 , Y 2 ) ) :
<
<
< FONCTION :
< CE MODULE EST CHARGE DE L'INTERPOLATION
< GRAPHIQUE ENTRE 2 POINTS ARGUMENTS (X1,Y1)
< ET (X2,Y2), SUIVANT LE MODE 'SBT'/'RBT' PRECISE
< PAR L'ARGUMENT 'DKMTMO'.
< ON TROUVERA DANS 'DCTDKU' LE FORMAT DES
< ARGUMENTS TELS QUI SONT SITUES DEVANT
< L'IMAGE RECEVANT LE SEGMENT. ON NOTERA
< QUE LES COORDONNES ARGUMENT SONT DONNEES
< EN FORMAT GRAPHIQUE, PUIS RENVOYEE SI
< TOUT S'EST BIEN PASSE EN FORMAT 'TV'
< AU DEMANDEUR...
< ENFIN ON NOTERA LE MOT "INUTILE" APPELE
< 'DKMTCO' ET DESTINE A EVITER DES PERTES
< D'INFORMATIONS DUES AU FAIT QUE LE BLOC
< FLOTTANT ECRIT DANS LE MOT D'ADRESSE (C)-'DEPCS'...
<
<
DKMTV5: EQU $ < POINT D'ENTREE...
< (A)=(CODEM)-TVLIMA*LK*NOCMO,
< (Y)=MOT DE CONTROLE DE LA 'TV'...
<
< GESTION DES NIVEAUX :
<
IF NIVMAX-K,,,XEIF%
IF 'NIVMAX' EST MAUVAIS !!!
XEIF%: VAL ENDIF
STZ VAR+DKNIVO < A PRIORI,
DC VAR+DKNIVO < PAS DE NIVEAU DE GRIS...
CPI DKMTXY*NOCMO < AVEC OU SANS ???
JE DKMTW4 < SANS...
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
LA VAR+FWORK < (A)=(CODEM),
XEIF%1: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
LA VAR+DKPOIN < (A)=(CODEM),
XEIF%1: VAL ENDIF
CPI DKMTXY*NOCMO < EST-CE UN 'CODEM' REDUIT ???
JNE DKMTVK < NON...
LA DKMTMO-DEPCS,C < OUI, ALORS EST-CE BIEN 'MEMTV' QUI
ANDI DKMOBA < EST DEMANDEE ???
JAE DKUT8 < NON, ERREUR...
JMP DKMTVL < OUI, ON CONTINUE...
DKMTVK: EQU $
SB VAR+DKMLI3 < EST-CE UNE TRAME AVEC NIVEAU DE GRIS ???
JANE DKUT50 < NON, ALORS PEUT-ETRE TRANSFERT GLOBAL
< EN MODE ENTRELACE...
DKMTVL: EQU $
CPZR Y < OK, AVEC NIVEAU DE GRIS ; MAIS A-T'ON
< DEMANDE UNE VISUALISATION ???
DKUT8A: JNE DKUT8 < OUI, ERREUR, ON NE PEUT PAS TOUT FAIRE...
< (ET RELAI...)
LA DKMTMO-DEPCS,C < (A)=MODE DEMANDE POUR LE TRACE :
ANDI DKMNIV < ON EXTRAIT LE NIVEAU DE GRIS,
XWOR%1: VAL DKMNIV=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1
XEIF%: VAL ENDIF
CPI ANTIAL < ET ON LE VALIDE...
JG DKUT8 < TROP GRAND...
JNE DKMTVE < IL S'AGIT D'UN NIVEAU DE GRIS IMPOSE...
IF ANTIAL-NIVMAX-I,,XEIF%,
IF ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%: VAL ENDIF
LAI NIVMAX < IL S'AGIT D'UNE DEMANDE D'ANTI-ALIASING,
< ON PREND LE MAX, AU CAS OU LE SEGMENT A
< TRACER SERAIT HORIZONTAL OU VERTICAL...
DKMTVE: EQU $
STA VAR+DKNIVO < INITIALISATION DE 'DKNIVO', AU CAS OU
< L'ON TOMBERAIT SUR UNE HORIZONTALE OU
< UNE VERTICALE...
<
< GESTION DES "TRANSPARENCES" :
<
LA DKMTCO-DEPCS,C
STA VAR+DKTCO < TRANSMISSION DU CHAMP 'DKMLCO' EN
< PARTICULIER...
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES :
<
IF DKMPOI-MOCD,,XEIF%,
IF ATTENTION : VU LE 'SWBR', 'DKMPOI' DOIT ETRE
IF UN OCTET !!!
XEIF%: VAL ENDIF
ANDI DKMPOI < RECUPERATION DE LA PATTERN DES POIN-
< TILLES...
XWOR%5: VAL DKMPOI=K
IF XWOR%5-K,,XEIF%,
SLRS XWOR%5 < ET CADRAGE SI NECESSAIRE...
XEIF%: VAL ENDIF
SWBR A,B < DUPLICATION DANS L'OCTET GAUCHE DE 'B',
ORR B,A < ET MISE SUR 16 BITS DANS 'A' PAR
< DUPLICATION DE 'DKMPOI'...
STA VAR+MDKMPO < ET INITIALISATION AISNI DE LA PATTERN
< CYCLIQUE DES POINTILLES...
XEIF%1: VAL ENDIF
<
< GESTION DES DECALAGES :
<
LA DKMTMO-DEPCS,C
ANDI DKMDEC
SLRS DKMDEC=K < (A)=DECALAGE A APPLIQUER AU NIVEAU ANTE-
< RIEUR DE CHAQUE POINT...
STA VAR+DKDECA < OK, MEMORISATION DU DECALAGE...
LA DKMTMO-DEPCS,C < (A)=MODE DEMANDE POUR LE TRACE :
XWOR%5: VAL CODBT=FMASK(K?DKMSRI=FCINST)DKMSRI
IF XWOR%5-L,,XEIF%,
SLLS XWOR%5 < CADRAGE A GAUCHE...
XEIF%: VAL ENDIF
SARS DKMSRI=K < ON EXTRAIT LE MODE 'SBT', 'RBT' OU 'IBT',
JMP DKMTVC < VERS SA MEMORISATION ; NOTONS QUE
< TEST SUR 'Y' A DEJA ETE FAIT...
DKMTW4: EQU $
LR Y,A < (Y)=A=MOT DE CONTROLE REDUIT DE 'TV'.
ANDI TVIN < L'ENTREE EST-ELLE DEMANDEE ???
JANE DKUT8 < IL EST COMPLETEMENT IDIOT CELUI-LA !!!
<
< VALIDATION DU MODE DE TRACE :
<
LA DKMTMO-DEPCS,C < VALIDATION DU MODE DEMANDE...
DKMTVC: EQU $
STA VAR+DKMTRS < MEMORISATION DU MODE DE TRACE DEMANDE ;
< ON LE FAIT AVANT LA VALIDATION AFIN
< D'INCLURE LA NOUVELLE LOGIQUE BINAIRE...
RBT DKLODD < METTONS NOUS A PRIORI EN LOGIQUE FLOUE
< (OU EN MODE 'SBT'/'RBT'/'IBT'), ET CECI
< AFIN DE NE PAS INTRODUIRE DE NOUVELLES
< FONCTIONS (AUTRES QUE 'DKMTSB', 'DKMTRB'
< ET 'DKMTIB'),
TBT DKLODF < ON DUPLIQUE LE BIT 'DKLOGF' SUR 'DKLOGD'
< AFIN DE SE METTRE EN FLOU...
JNC DKMTVM < CAS DE 'DKMTSB' OU 'DKMTRB'...
SBT DKLODD < CAS DE 'DKMTIB'...
DKMTVM: EQU $
CPI DKMTSB < ???
JE DKMTV7 < OK...
CPI DKMTRB < ???
JE DKMTV7 < OK...
CPI DKMTIB < ???
JNE DKUT8 < NON, SORTIE EN ERREUR...
DKMTV7: EQU $
IF DKMTCO-K,,XEIF%,
IF ATTENTION : IL FAUT QUE LE MOT RESERVE AU BLOC
IF FLOTTANT SOIT EN TETE SINON !!!
XEIF%: VAL ENDIF
CALL #SISP CMS5 PSRSLO#
< SAUVEGARDE DE (SLO,SLE),
LRM A,B
WORD MEMTV0
WORD MEMTVE-Z < NOTA : ON NE PREND PAS LA 'CDAI' ENTIERE
< AFIN D'EVITER DES PROBLEMES AU CAS OU
< L'ON AURAIT "!CDAI=J" ACTIVE...
BSR VAR+ATWOED < ON SE PLACE SUR 'MEMTV' A PRIORI...
<
< REDUCTION DES COORDONNEES (PASSAGE
< DE L'ECHELLE GRAPHIQUE A L'ECHELLE TV) :
<
< NOTA SUR LA "FRUSTRATION DES PIXELS" :
< RAISONNONS A UNE DIMENSION,
< SUR L'AXE DES 'X' PAR EXEMPLE :
< IMAGINONS 3 POINTS 'A', 'M' ET
< 'B' TELS QUE :
<
< X(A)='100,
< X(M)='1FF,
< X(B)='2FE,
< ON A :
< X(M)=(X(A)+X(B))/2,
< ET :
< X(M)-X(A)=X(B)-X(M)='FF,
< LE POINT 'M' EST AU MILIEU DU
< SEGMENT GRAPHIQUE 'AB' :
<
< AM=MB.
< APPLIQUONS LA REDUCTION 'TV',
< C'EST-A-DIRE DIVISONS LES COOR-
< DONNEES PAR 4 :
<
< XT(A)='100/4='40,
< XT(M)='1FF/4='7F,
< XT(B)='2FE/4='BF,
< ON A MAINTENANT :
< XT(M)-XT(A)='3F,
< XT(B)-XT(M)='40,
< LE POINT 'M' EN FORMAT 'TV' N'EST
< PLUS AU MILIEU DU SEGMENT 'AB' !!!
< IL Y A AINSI FRUSTRATION DU
< POINT 'M', ET SUIVANT LA METHODE DE
< CORRECTION APPLIQUEE, 'M' SE RAP-
< PROCHERA DE 'A' (CAS DES DIVISIONS
< PAR DEFAUT CI-DESSUS), OU DE 'B'
< (DIVISION PAR EXCES) ; ETENDU A
< DEUX DIMENSIONS, ON VOIT QU'AINSI
< LES PENTES DES VECTEURS RISQUENT
< DE NE PAS ETRE CONSERVEE LORS DU
< PASSAGE GRAPHIQUE-TV...
< DE PLUS, UNE METHODE DE CORRECTION
< "CONTEXTUELLE" (C'EST-A-DIRE TENANT
< COMPTE DU SEGMENT ENTIER POUR CORRIGER
< LES COORDONNEES INDIVIDUELLES DES
< EXTREMITES) FAIT QU'UN MEME POINT
< APPARTENANT A DEUX SEGMENTS DIFFERENTS
< (VOIR PAR EXEMPLE LES SOMMETS D'UN
< CARRE) RISQUE DE DONNER NAISSANCE A
< DEUX POINTS DIFFERENTS EN 'TV'...
<
PSR W < SAUVEGARDE DE LA BASE 'W'...
XWOR%1: VAL BIT>XXDEDX-E < POUR LES DIVISIONS PAR EXCES SUR 'X',
XWOR%2: VAL BIT>XXDEDY-E < POUR LES DIVISIONS PAR EXCES SUR 'Y'.
IF XWOR%1-XWOR%2,,XEIF%,
IF ATTENTION : LA MISE DE L'INCREMENT DANS 'W' EST
IF MAUVAISE, IL FAUT DEUX REGISTRES !!!
XEIF%: VAL ENDIF
LAI XWOR%1?XWOR%2(K < CONSTANTE DE GESTION DE LA FRUSTRATION :
< =0 : LES PENTES NE VONT PAS ETRE RES-
< PECTEES EN PASSANT DU GRAPHIQUE
< A LA 'TV' BASSE-DEFINITION (DANS
< CERTAINS CAS : LORSQUE LES COORDON-
< NEES NE SONT PAS EXACTEMENT DIVISI-
< BLES...),
< #0 : UN MEME POINT GRAPHIQUE RISQUE DE
< DONNER NAISSANCE A PLUSIEURS POINTS
< 'TV' (LORSQUE LES COORDONNEES NE
< SONT PAS EXACTEMENT DIVISIBLES...),
< VOIR PAR EXEMPLE UN CARRE...
LR A,W < (W)=CONSTANTE DE FRUSTRATION.
LA DKMGX1-DEPCS,C < COORDONNEE X1 :
CP DKMGX2-DEPCS,C
JGE DKMTWP < (X1)>=(X2)...
ADR W,A < (X1)<(X2)...
DKMTWP: EQU $
SARS XXDEDX < CONVERSION EN MODE 'TV',
LR A,X < ET STOCKAGE TEMPORAIRE : (X)=X1.
LA DKMGY1-DEPCS,C < COORDONNEE Y1 :
CP DKMGY2-DEPCS,C
JGE DKMTWQ < (Y1)>=(Y2)...
ADR W,A < (Y1)<(Y2)...
DKMTWQ: EQU $
SARS XXDEDY < CONVERSION EN MODE 'TV',
NGR A,A < EN EFFET LES AXES 'Y' DE 'TV' ET
AD VAR+DKMTNL < DU GRAPHIQUE SONT INVERSES...
LR A,Y < ET STOCKAGE TEMPORAIRE : (Y)=Y1.
LA DKMGX2-DEPCS,C < COORDONNEE X2 :
CP DKMGX1-DEPCS,C
JGE DKMTWR < (X2)>=(X1)...
ADR W,A < (X2)<(X1)...
DKMTWR: EQU $
SARS XXDEDX < CONVERSION EN MODE 'TV,
LR A,B < ET STOCKAGE TEMPORAIRE : (B)=X2.
LA DKMGY2-DEPCS,C < COORDONNEE Y2 :
CP DKMGY1-DEPCS,C
JGE DKMTWS < (Y2)>=(Y1)...
ADR W,A < (Y2)<(Y1)...
DKMTWS: EQU $
SARS XXDEDY < CONVERSION EN MODE 'TV',
NGR A,A < EN EFFET, LES AXES 'Y' DE 'TV' ET
AD VAR+DKMTNL < DU GRAPHIQUE SONT INVERSES...
<
< ORDONNANCEMENT DES COORDONNEES TEL QUE (X1)<=(X2) :
< (JE SUPPRIME LE CODE, CAR DE TOUTE EVIDENCE
< CELA N'ARRANGE PAS LES CHOSES, MAIS JE LE
< LAISSE EN COMMENTAIRES, CAR ON NE SAIT
< JAMAIS...)
<
< CPR B,X < COMPARAISON DE (X1) ET (X2) :
< JLE DKMTWG < OK, (X1)<=(X2)...
< XR A,Y < SINON, ON PERMUTE
< XR B,X < LES 2 POINTS...
DKMTWG: EQU $
PLR W < RESTAURE LA BASE 'W' QUI POINTE LA
< LISTE DES COORDONNEES...
< A T T E N T I O N : LES COMMENTAIRES
< QUI SUIVENT N'ONT PLUS DE VALEUR :
STA DKMTY2-DEPCS,C < (A)=Y2 SI (X1)<=(X2), (A)=Y1 SINON,
STB DKMTX2-DEPCS,C < (B)=X2 SI (X1)<=(X2), (B)=X1 SINON,
STY DKMTY1-DEPCS,C < (Y)=Y1 SI (X1)<=(X2), (Y)=Y2 SINON,
STX DKMTX1-DEPCS,C < (X)=X1 SI (X1)<=(X2), (X)=X2 SINON.
<
< CALCUL DELTAX ET DELTAY.
<
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
STZ VAR+DKPOIN < A PRIORI, IL NE S'AGIT PAS D'UN POINT
< ISOLE...
XEIF%1: VAL ENDIF
LA DKMTX2-DEPCS,C
SB DKMTX1-DEPCS,C
STA VAR+DKMTDX < DELTAX=X2-X1.
FLT
FST VAR+DKMTDF < DELTAX FLOTTANT.
LA DKMTY2-DEPCS,C
SB DKMTY1-DEPCS,C
STA VAR+DKMTDY < DELTAY=Y2-Y1.
JAE DKUT1
CPZ VAR+DKMTDX
JNE DKUT2
<
< ICI, DELTAX = 0 ET DELTAY # 0 : LIGNE VERTICALE.
<
IF DKMTY1-DKMTC-D,XEIF%,,XEIF%
ADRI D,W < POUR FAIRE VARIER Y DANS LA BOUCLE.
XEIF%: VAL ENDIF
LX VAR+DKMTDY
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
LA &VAR+DKMINF < (A)=PENTE D'UNE DROITE VERTICALE...
XEIF%1: VAL ENDIF
DKUT3: EQU $
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
FLT
FST VAR+DKMTA < MISE EN PLACE DE LA PENTE DES DROITES
< VERTICALES (INFINI) ET HORIZONTALE
< (NULLE)...
XEIF%1: VAL ENDIF
LAI I < PAS DE VARIATION = 1 A PRIORI.
CPZR X
JGE DKUT32
NGR A,A < PAS DE VARIATION = -1.
NGR X,X < COUNT POSITIF.
DKUT32: EQU $
ADRI I,X < AFIN DE TRACER LE POINT EXTREME (X2,Y2).
DKUT31: EQU $
PSR A < SAUVEGARDE DU PAS...
LA DKMTX1-DEPCS,C
FLT
FST VAR+DKMTX < FLOTTAGE
LA DKMTY1-DEPCS,C
FLT
FST VAR+DKMTY < DES COORDONNEES...
PLR A < RESTAURATION DU PAS...
BSR VAR+DKMTA2 < ET TRACE DU POINT COURANT (X1,Y1)...
XM O,W
AD O,W < INCREMENTATION/DECREMENTATION D'1...
XM O,W
JDX DKUT31 < POINT SUIVANT.
JMP DKUT40 < C'EST FINI.
DKUT8: JMP DKMTV8 < RELAI...
<
< ICI, DELTAY=0 : LIGNE HORIZONTALE (OU POINT
< ISOLE SI DELTAX=0) :
<
DKUT1: EQU $
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
CPZ VAR+DKMTDX < EST-CE UN POINT ISOLE ???
< (DELTAX)=(DELTAY)=0...
JNE DKUT1A < NON (ON A DEJA : (DKPOIN)=0)...
IC VAR+DKPOIN < OUI, ON LE MEMORISE...
DKUT1A: EQU $
XEIF%1: VAL ENDIF
IF DKMTX1-DKMTC-D,XEIF%,,XEIF%
ADRI D,W < POUR FAIRE VARIER X DANS LA BOUCLE.
XEIF%: VAL ENDIF
LX VAR+DKMTDX
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
LAI K/W < (A)=PENTE D'UNE DROITE HORIZONTALE...
XEIF%1: VAL ENDIF
JMP DKUT3 < ET VOILA.
DKUT2: EQU $
<
< ICI, DELTAX # 0 ET DELTAY # 0,
< IL FAUT DONC CALCULER L'EQUATION
< DE LA DROITE :
<
FLD VAR+DKMTDF < (A,B)=DELTAX.
FST VAR+DKMTA
LA VAR+DKMTDY
FLT
FDV VAR+DKMTA
FST VAR+DKMTA < (DKMTA)=(A,B)=DELTAY/DELTAX.
LA DKMTX1-DEPCS,C
FLT
FMP VAR+DKMTA
FST VAR+DKMTB
LA DKMTY1-DEPCS,C
FLT
FSB VAR+DKMTB
FST VAR+DKMTB < (DKMTB)=(A,B)=Y1-(DKMTA)*X1.
<
< TRACE DU SEGMENT A L'AIDE DE 'N' POINTS
< TEL QUE N=MAX(ABS(DELTAX,DELTAY)) :
<
LA VAR+DKMTDX < (A)=DELTAX.
JAGE DKUT11
NGR A,A < (A)=ABS(DELTAX).
DKUT11: EQU $
LR A,Y
LA VAR+DKMTDY
JAGE DKUT12
NGR A,A
DKUT12: EQU $
CPR Y,A
JGE DKUT13
LR Y,A
DKUT13: EQU $
LR A,X < (A)=(X)=MAX(DELTAX,DELTAY) EN
< VALEUR ABSOLUE.
FLT
FST VAR+DKMTN < NOMBRE DE PAS EN FLOTTANT.
LYI K < (Y)=NUMERO DE PAS (DE 0 A 'N').
DKUT5: EQU $
LR Y,A < NUMERO DU PAS COURANT.
FLT
FMP VAR+DKMTDF
FDV VAR+DKMTN
FST VAR+DKMTX < ((NUMERO DE PAS)*(DELTAX))/(NOMBRE PAS).
LA DKMTX1-DEPCS,C
FLT
FAD VAR+DKMTX
FST VAR+DKMTX < (DKMTX)=COORDONNEE 'X' COURANTE FLOTTANT,
FMP VAR+DKMTA
FAD VAR+DKMTB
FST VAR+DKMTY < (DKMTY)=COORDONNEE 'Y' COURANTE FLOTTANT,
< = A*X+B, SOIT : Y=A*X+B...
BSR VAR+DKMTA2 < TRACE POINT DU POINT COURANT DE
< COORDONNEES (DKMTX,DKMTY) FLOTTANTES.
ADRI I,Y < INCREMENTATION DU PAS (Y),
CPR X,Y < ET PASSAGE AU POINT SUIVANT,
JLE DKUT5 < S'IL EXISTE...
<
< SORTIE NORMALE :
<
DKUT40: EQU $
< RESTAURATION DE (SLO,SLE) :
CALL #SISP CMS5 PLRSLO#
JMP DKMTV6 < VERS UN DISPLAY EVENTUEL DE L'IMAGE.
<
< SORTIES EN ERREUR :
<
DKMTV8: EQU $
LA VAR+DKTCO
STA DKMTCO-DEPCS,C < RESTAURATION DE 'DKMTCO' QUI EST DETRUIT
< PAR CE MALHEUREUX BLOC FLOTTANT !!!
PLR B,Y,C,W < ON RESTAURE...
JMP GRDKM3 < VERS LA SORTIE EN ERREUR DU HANDLER...
PAGE
<
<
< A C C E S U T I L I S A T E U R S A L A
< T E L E V I S I O N N U M E R I Q U E :
<
<
DKMTV1: EQU $
RDOE < LECTURE DE (SLO,SLE) COURANTS :
LRM B
WORD MEMTV0 < (B)=ADRESSE DE 'MEMTV',
CPR A,B < LA DEMANDE COURANTE REFERENCE-T'ELLE
< 'MEMTV' ???
JNE DKMTQ1 < NON, DONC PAS DE TESTS DE PROTECTION
< PAR "!Q1"...
LA NSPTYP
TBT VBOX < LA DEMANDE COURANTE A-T'ELLE UNE 'BOX' ?
JNC DKMTQ1 < NON, PAS DE TEST DE BLOCAGE...
LA BOX < OUI :
EOR VAR+LSDK < ON FAIT UN .EOR. ENTRE LA LISTE DES
< APPROPRIATIONS PARTIELLES ('BOX') ET
< LA LISTE DES APPROPRIATIONS GENERALES
< ('LSDK') :
TBT BLDKTV < ON TESTE LE DERNIER GROUPE DE CYLINDRES
< QUI PROTEGE AUSSI L'ACCES A 'MEMTV' :
JC GRDKM3 < ERREUR, L'ACCES EST INTERDIT POUR CE
< DEMANDEUR : BOX=0 ET LSDK=1 (L'AUTRE
< CONFIGURATION DE BITS (1 ET 0) ETANT
< IMPOSSIBLE...
DKMTQ1: EQU $ < PAS DE TEST NECESSAIRE, OU BIEN
< (BOX)=LSDK : ACCES LIBRE (=0), OU BIEN
< RESERVE A CE DEMANDEUR (=1)...
LA ARGDEM+AMDEM
SLRD NOCMO=NBITMO < (B)=ADRESSE MOT DE L'IMAGE.
LA ARGDEM+ASDEM < INDICATEURS DE CONTROLE PRESUMES...
ANDI TVIN?TVSIMU < NE CONSERVONS QUE LE NECESSAIRE :
CP ARGDEM+ASDEM < Y-AVAIT'IL AUTRE CHOSE ???
JNE GRDKM3 < OUI, REFUSE...
LR A,Y < (Y)=MOT DE CONTROLE DE LA 'TV'...
LA ARGDEM+CODEM
IF DIMALI-DIMAL2,XEIF%1,,XEIF%1
STA VAR+FWORK < SAUVEGARDE DU 'CODEM' A CAUSE DE 'W'...
XEIF%1: VAL ENDIF
IF DIMALI-DIMAL1,XEIF%1,,XEIF%1
STA VAR+DKPOIN < SAUVEGARDE DU 'CODEM' A CAUSE DE 'W'...
XEIF%1: VAL ENDIF
SB VAR+DKMLI1 < DISCRIMINATION DISPLAY/INTERPOLATION...
JAE DKMTV2 < SEUL UN DISPLAY A ETE DEMANDE...
<
<
< I N T E R P O L A T I O N :
<
<
PSR B,Y,C,W < ET OUI, MEME 'C'...
LR B,C < (C)=ADRESSE DE L'EN-TETE,
LR B,W
ADRI DKMTC,W < (W)=BASE DE LA LISTE DES SEGMENTS.
LBI DEPCS < ATTENTION : DEPCS>127 !!!
ADR B,C < AINSI, (C)-'DEPCS' POINTE SUR LE MOT
< 'DKMTCO' RESERVE AUX EXTRAVAGANCES DU
< BLOC FLOTTANT !!!
< MAIS, A T T E N T I O N... DORENAVANT
< 'DKMTCO' TRANSMET (PAR MANQUE DE PLACE)
< LE CHAMP 'DKMLCO' !!!
BR VAR+DKMTA5 < VERS L'INTERPOLATION...
< (A)=(CODEM)-TVLIMA*LK*NOCMO,
< (Y)=MOT DE CONTROLE DE LA 'TV'...
<
< RETOUR DE L'INTERPOLATION :
<
DKMTV6: EQU $
LA VAR+DKTCO
STA DKMTCO-DEPCS,C < RESTAURATION DE 'DKMTCO' QUI EST DETRUIT
< PAR LE BLOC FLOTTANT (ET FLUCTUAT NEC
< MERGITUR... COMME ON DIT A LA SEMS...).
PLR B,Y,C,W
ADRI DKMTXY,B < (B)=ADRESSE MOT DE L'IMAGE...
<
<
< D I S P L A Y :
<
<
DKMTV2: EQU $
LR Y,A < (A)=MOT DE CONTROLE DE LA 'TV'...
PSR W
CALL #SISP CMS5 W ZERO#
< (W)=BASE DE LA MEMOIRE DEBANALISEE.
XM TVCTRL-ZERO,W < POSITIONNEMENT DU CONTROLE,
XR A,B < PERMUTATION ET SAUVEGARDE...
XM TVMEME-ZERO,W < AINSI QUE DE L'ADRESSE DE L'IMAGE...
SVC SVCM3 < ET ON VISUALISE...
XM TVMEME-ZERO,W < PUIS ON RESTAURE CE
XR A,B
XM TVCTRL-ZERO,W < L'ON A DETRUIT...
PLR W < PUIS L'ADRESSE DE LA DEMANDE COURANTE.
STZ ETAT0 < RETOUR OK, POUR LA TV...
JMP DKM3RR < ET C'EST FINI...
PAGE
<
<
< S I M U L A T I O N ' D K U ' S U R ' D K M ' :
<
<
< NOTA :
< LORSQUE 'DKU' EST SIMULE SUR 'DKM',
< 'DKU' TRANSMET SES DEMANDES A 'DKM',
< EN VERIFIANT AU PREALABLE, AVEC UNE
< MARGE DE SECURITE, QUE L'ECHANGE
< DEMANDE PORTE SUR DES 'QUANTA'-SECTEURS
< APPARTENANT A DES 'GB' INACCESSIBLES
< A L'ALLOCATION DISQUE (BIT0 DE 'NSLGB'
< A 1).
<
<
DKU1: EQU $
LA ARGDEM+OPDEM
TBT XBITQ < L'ECHANGE DEMANDE CONCERNE-T'IL
< DES SECTEURS OU DES Q-SECTEURS ???
LA ARGDEM+ASDEM < A PRIORI DES Q-SECTEURS, ET ALORS,
< (A)=ADRESSE DU PREMIER Q-SECTEUR...
JNC DKU2 < OUI, DES Q-SECTEURS...
SLRD NBITMO < NON, DES SECTEURS, DANS CES CONDI-
DV VAR+DKMQUA < ON CONVERTIT EN Q-SECTEURS.
DKU2: EQU $
LR A,Y < (A)=(Y)=NUMERO DU Q-SECTEUR CONTENANT
< LE PREMIER OCTET ECHANGE.
SLRS DECON < DECONCATENATION (VOIR 'HDLREL'),
ADRI IJIJDX,A < ET CONVERSION EN NUMERO DE 'GB' :
LR A,X < (X)=NUMERO DU 'GB' CONTENANT LE PREMIER
< OCTET DE L'ECHANGE.
LA ARGDEM+CODEM < (A)=NOMBRE D'OCTETS ECHANGES,
AD VAR+DKMLS < ET MAJORATION LARGE...
SLRD NBITMO
DV VAR+DKMLS < (A)=NOMBRE DE Q-SECTEURS MAJORE NECES-
< SAIRES POUR CONTENIR LES OCTETS
< ECHANGES.
ADR Y,A < (A)=NUMERO DU Q-SECTEUR MAJORE CONTE-
< NANT LE DENIER OCTET DE L'ECHANGE.
SLRS DECON < DECONCATENATION,
ADRI IJIJDX,A < ET CONVERSION EN UN NUMERO DE 'GB' :
< (A)=NUMERO MAJORE DU 'GB' CONTENANT
< LE DERNIER OCTET DE L'ECHANGE.
LR A,Y < (Y)=NUMERO DU 'GB' CONTENANT LE DERNIER
< OCTET ECHANGE, OU BIEN SUIVANT...
LRM A
WORD COSBT?XXINGB=FMASK(K?NBSPGB=FCINST
< (A)=ETAT D'UN 'GB' INACCESSIBLE A L'ALLO-
< CATION DISQUE (BITSIG) ET N'ETANT PAS
< UTILISE ('NBSPGB' Q-SECTEURS LIBRES)
< CET ETAT EST DONNE PAR 'ANSLGB'.
CP &ANSLGB < LE PREMIER 'GB' (X) EST-IL UTILISABLE
< POUR LA SIMULATION DE 'DKU' ???
JNE DKU3 < NON, ERREUR, MAUVAIS !!!
XR X,Y
CP &ANSLGB < LE DERNIER 'GB' (Y <--> X) L'EST-IL ???
JE DKU4 < OUI, C'EST BON, LES OCTETS A ECHANGER
< SONT SUR DES 'GB' LIBRES ET NON
< ALLOUABLES.
DKU3: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
< L'ECHANGE PORTE ENTIEREMENT OU
< PARTIELLEMENT SUR DES Q-SECTEURS
< ALLOUABLES !!!
<
< QUE FAIRE ???
< VERIFIER LES TABLES D'ALLOCATION DISQUE...
<
JMP GRDKM3 < PUIS, ON SORT EN ERREUR, EN EFFET,
< IL PEUT AUSSI S'AGIR D'UNE ERREUR
< D'UTILISATION !!!
<
< TRANSMISSION DE LA DEMANDE 'DKU' VERS 'DKM' :
<
DKU4: EQU $
LA NSPTYP
ANDI MKTD < (A)=INDICATEURS A TRANSMETTRE D'UNE
LR A,Y < DEMANDE A L'AUTRE, ET MISE DANS 'Y'.
LAD ARGDEM+OPDEM < (A)=ADRESSE EMETTRICE...
PSR W < SAUVEGARDE DE L'ADRESSE DE LA
< DEMANDE A 'DKU'.
LRM B,X,W
WORD DEMUN+T < (B)=ADRESSE RECEPTRICE,
WORD ASDEM-OPDEM+Z < (X)=NOMBRE DE MOTS A DUPLIQUER,
WORD DEMUN < (W)=ADRESSE DE LA DEMANDE A 'DKM'.
MOVE < DUPLICATION DES ARGUMENTS A 'DKU'
< DANS LA DEMANDE A 'DKM'.
STY NSPTYP < TRANSMISSION DES INDICATEURS,
LAI NSPDKM < ET MISE EN PLACE DU 'NSP'
STBY NSPTYP < DE 'DKM'...
BSR ACHAND < ENVOI DE LA DEMANDE A 'DKM',
BSR ACHANW < ET ATTENTE DE FIN D'ECHANGE...
LA ARGDEM+ETADEM < TRANSMISSION DES
STA ETAT0 < CONDITIONS DE RETOUR...
PLR W < RESTAURE (W)=ADRESSE DE LA
< DEMANDE A 'DKU'.
JMP DKM3RR < ET ON SORT NORMALEMENT...
PAGE
<
<
< E N T R Y ' D K U ' :
<
<
HDLDKU: EQU $
TBT TYPAD < ADRESSE MOT OU OCTET ???
JC DKM11X < MOT, PAS DE VERIFICATIONS...
LA ARGDEM+AMDEM < OCTET : DOIT ETRE A UNE FRONTIERE PAIRE.
TBT NBITMO-B < PAIRE ???
JC GRDKM3 < ERREUR, ADRESSE IMPAIRE...
DKM11X: EQU $
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE,
CPI FONTV < EST-CE LA TELEVISION NUMERIQUE ???
JE DKMTV1 < OUI, QUEL TRUANDAGE QUAND MEME ?!?!??
LA ARGDEM+CODEM < VALIDATION DU 'CODEM'.
JALE GRDKM3 < ERREUR...
ADRI NOCMO-E,A < ARRONDI PAR EXCES,
SLRS NOCMO=K < ET CONVERSION EN MOTS...
CP VAR+NMMDKM < TROP ???
JG GRDKM3 < OUI, ERREUR...
LA ETASYS < ACCES AUX INDICATEURS DE CONTROLE
< DU SYSTEME,
TBT NSPDKU-NSPDK < 'DKU' EST-IL PRESENT ???
JNC DKU1 < NON, ON VA LE SIMULER SUR 'DKM'...
<
< LORSQUE 'DKU' EST LA, FAUT-IL LE
< SYNCHRONISER SUR LE SECTEUR 0 ???
<
LBI CORBT?CCBDKM=FMASK(K=FCINST
LA ARGDEM+OPDEM
XWOR%1: VAL FGR?FGW=K
TBT NBITMO-B-XWOR%1 < LECTURE OU ECRITURE ???
JNC DKUS2 < LECTURE, PAS DE SYNCHRONISATION SUR
< LE SECTEUR 0...
LA MEMV < ECRTURE, QUEL EST L'ETAT DE 'MEMV' ???
TBT XSYNC0 < ALORS ???
JC DKUS1 < XSYNC0=1 : OUI, SYNCHRONISATION SUR 0...
DKUS2: EQU $ < CAS DES LECTURES...
SBT NBITMO+CCBDKM < XSYNC0=0 : NON...
DKUS1: EQU $
STB VAR+DSYNC0 < INDICATEUR, ET GENERATEUR DU 'CCB'.
LRM A
WORD DKUTT1
PSR A < AFIN DE SIMULER UN 'BR' VERS 'DKUTT1',
< POUR ECONOMISER UN MOT DANS 'DCTDKU'...
RSR < ALLONS TESTER LE MODE DE TRANSFERT
< RAPIDE 'DKU' --> 'MEMTV' (EN 'DKUTT1').
GRDKM3: BR VAR+ADKM3 < RELAI DE RELAI...
DKM3RR: JMP DKM3R1 < RELAI DE RELAI...
PAGE
<
<
< E N T R Y ' D K M ' :
<
<
HDLDKM: EQU $
<
< VALIDATION DE LA DEMANDE :
<
TBT TYPAD < ADRESSE MOT OU OCTET ???
JC DKM11 < MOT, PAS DE VERIFICATION...
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTET DU BUFFER,
TBT NBITMO-B < EST-ELLE BIEN A UNE FRONTIERE DE MOT ???
JNC DKM11
BSR ASYSER
DKM11: EQU $
LA ARGDEM+ETADEM < (A)=NSP(DEMANDEUR).
LXI LLDKMN < (X)=NOMBRE DE 'NSP' AUTORISES,
DKM11Y: EQU $
CP &VAR+ALDKMN < LE 'NSP' EST-IL AUTORISE ???
JE DKM60 < OUI, ON Y VA...
JDX DKM11Y < PEUT-ETRE...
ZDKM: EQU $ < ADRESSE DE LA SYSER SUR DEMANDEUR
< DE 'DKM' NON RECONNU.
BSR ASYSER < NI L'UN, NI L'AUTRE : A NOTER QUE
< CELA N'EST PAS FORCEMENT UNE ERREUR
< SYSTEME : CF. LES DUMPS DISQUES
< PAR EXEMPLE...
DKM60: EQU $
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DU BUFFER,
ADRI NOCMO-E,A < QUE L'ON ARRONDIT EVENTUELLEMENT AU MOT
< SUPERIEUR,
SLRS NOCMO=K
CP VAR+NMMDKM < ET VALIDATION ???
JG HRDKM3 < ERREUR : ECHANGE TROP GRAND...
LA ARGDEM+ASDEM < (A)=ADRESSE DU PREMIER SECTEUR,
CP INFINI < LE SECTEUR 'INFINI' EST IMPOSSIBLE
< A ATTEINDRE CAR EN EFFET, UN CHAINAGE DU
< TYPE 'INFINI' EST UNE MARQUE DE FIN DE
< CHAINE ; IL FAUT DONC QUE CELUI-CI SOIT
< INALLOUABLE, CE QUE L'ON VERIFIE ICI...
JNE DKM1 < OK, SECTEUR AUTORISE PAR L'ALLOCATION...
BSR ASYSER < C'EST PEUT-ETRE UNE ERREUR SYSTEME,
< OU PEUT-ETRE PAS (VOIR PAR EXEMPLE DES
< PROGRAMMES DE COPIE DE DISQUE... DANS
< CES CONDITIONS, APRES AVOIR SIGNALE
< L'ANOMALIE, ON CONTINUE...
DKM1: EQU $
XWOR%1: VAL DKMINX=K
XWOR%1: VAL -XWOR%1
SLRS -XWOR%1
CPI DKMINX>XWOR%1 < EST-CE UN SECTEUR INEXISTANT ???
JNE DKM1XX < NON, ON VA FAIRE UNE ENTREE-SORTIE...
BR VAR+ADKMGS < OUI, VERS L'INITIALISATION...
DKM1XX: EQU $
<
< 'DKF' EST-IL PRESENT ???
<
LA ETASYS
TBT NSPDKF-NSPDK < 'DKF' EST-IL LA ???
JC DKM50 < OUI...
LA ARGDEM+ETADEM < NON, ALORS QUI EST LE DEMANDEUR ???
CPI NSPDKF < EST-CE JUSTEMENT 'DKF' ???
JE DKM52 < OUI, ON VA SIMULER...
LA ARGDEM+ASDEM < NON, MAIS LE DEBUT DU 'DKM' ETANT
< RESERVE A LA SIMULATION, IL FAUT
< VALIDER 'ASDEM' ; ON PEUT RENCONTRER
< CE CAS EN REPARTANT D'UNE ANCIENNE
< VERSION DKF+DKM EN NE DEMANDANT QUE
< DKM !!!
SLRS S < PARCE QU'ELLE PEUVENT ETRE NEGATIVES...
CP VAR+VALFM < VIOLATION ???
JGE SYSRB9 < NON, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< PEUT-ETRE UNE SORTIE EN ERREUR 'JMP ERDKM3'...
<
SYSRB9: EQU $
JMP DKM50 < VERS L'ACCES AU DISQUE...
DKM3R1: JMP DKM3R < RELAI...
PAGE
<
<
< S I M U L A T I O N ' D K F ' S U R ' D K M ' :
<
<
DKM52: EQU $
<
< PRISE EN COMPTE DES TRANSLATIONS
< D'ADRESSES EN Q=1 :
<
PSR X
LAI TRDKU0 < (A)=TRANSLATION NULLE A PRIORI...
LB NSPTYP
TBT NBITMO+VBOX < Y-A-T'IL UNE 'BOX' DANS LA DEMANDE
< COURANTE ???
JNC DKM52M < NON (C'EST EN GENERAL LE CAS DE 'DKM')...
LXI K < OUI, (X) VA INDEXER LA LISTE ASSOCIATIVE
< DES (APPROPRIATIONS,TRANSLATIONS) :
LA BOX < (A)=LISTE D'APPROPRIATION DES GROUPES
< DE CYLINDRES DU DEMANDEUR COURANT,
IF TRDKU0-K,,XEIF%,
IF ATTENTION : LE 'JAE' SUIVANT (QUI FINALEMENT
IF CONFOND UNE LISTE D'APPROPRIATION 'BOX', ET
IF UNE TRANSLATION RENVOYEE DANS 'A') VA MERDER !!!
XEIF%: VAL ENDIF
JAE DKM52M < PAS DE LISTE D'APPROPRIATIONS, PAS DE
< TRANSLATION, NAHHHH...
DKM52N: EQU $
CP &VAR+ATASQ < RECHERCHE DE LA LISTE COURANTE 'BOX'
< DANS LA LISTE 'TASQ'...
JE DKM52O < TROUVEE...
ADRI ITASQ,X < NON, A L'ENTREE SUIVANTE,
XR A,X < SI ELLE EXISTE :
CPI LTASQ < ???
XR A,X
JL DKM52N < OUI...
DKM52P: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT IL SE PEUT
< QUE LA LISTE D'APPROPRIATION
< COURANTE 'BOX' NE SOIT PAS DANS
< LA LISTE 'ATASQ' DU DISQUE COURANT !!!
< OU COMMENT LA TRANSLATION PEUT
< ETRE DIFFERENTE DES 'TRDKU' PREVUS !!!
<
LAI TRDKU0 < ET ON FORCE UNE TRANSLATION NULLE...
JMP DKM52M
DKM52O: EQU $
ADRI ITASQT,X < LORSQU'ON A TROUVE LA LISTE D'APPROPRIA-
< TION DU DEMANDEUR, LE MOT SUIVANT DE
< L'ENTREE COURANTE DONNE LA TRANSLATION,
LA &VAR+ATASQ < (A)=TRANSLATION EN Q=1...
JAL DKM52P < E R R E U R S Y S T E M E...
CPI TRDKUM < VALIDATION...
JG DKM52P < E R R E U R S Y S T E M E...
DKM52M: EQU $
PLR X
<
< CALCUL D'UN NUMERO DE SECTEUR :
<
LB ARGDEM+ASDEM < ADRESSE SECTEUR DEMANDEE.
DV VAR+NBSRPP < DANS LE CAS DE LA SIMULATION, ON
< FAIT COMME SI 'QUANTA'=1...
JNV SYSRBA < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VERIFIER LA 'DCT'...
<
SYSRBA: EQU $
STB VAR+SECT < (B)=NUMERO DE SECTEUR.
LR A,B
JMP DKM51 < VERS LA SUITE DES CALCULS...
PAGE
<
<
< A C C E S R E E L A U ' D K M ' :
<
<
DKM50: EQU $
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE,
TBT XBITQ < QUELLE VALEUR DONNER A 'QUANTA' ???
JC DKM52 < 1...
LAI K < 3...
LB ARGDEM+ASDEM < (A,B)=ADRESSE DU PREMIER SECTEUR.
<
<
< A T T E N T I O N :
< LA RELATION 1 QUANTUM="QUANTA" SECTEURS
< EST PRISE EN COMPTE DANS LA VALEUR DE
< 'NBSPP'.
<
<
DV VAR+NBSPP < CONVERSION EN UN COUPLE (PISTE,SECTEUR).
JNV SYSRBB
BSR ASYSER
<
< QUE FAIRE ???
< VERIFIER LA 'DCT'...
<
SYSRBB: EQU $
STB VAR+SECT < (B)=NUMERO DE SECTEUR/QUANTA.
ADR B,B < (B)=2*NUMERO DE SECTEUR/QUANTA.
XR A,B
AD VAR+SECT < (B)=3*NUMERO DE SECTEUR/QUANTA, ATTENTION
STA VAR+SECT < ON SUPPOSE QUE : QUANTA=3 !!!!
IF QUANTA-3,,XEIF%,
IF A T T E N T I O N : LA PROGRAMMATION PRECENTE,
IF SUPPOSANT : QUANTA=3 EST MAUVAISE !!!
XEIF%: VAL ENDIF
DKM51: EQU $
CPZ VAR+SECT < L'ECHANGE DEMANDE DEBUTE-T'IL SUR UNE
< FRONTIERE DE PISTE ???
JE DKM51P < OUI, AUCUN PROBLEME...
LA VAR+DSYNC0 < NON, ALORS :
TBT CCBDKM < TESTONS LA NULLITE DU BIT 'CCBDKM'
< DU MOT 'DSYNC0' CE QUI EQUIVAUT A TESTER
< SIMULTANEMENT LES 3 CONDITIONS SUIVANTES:
< 1 - EST-ON SUR 'DKU', ET
< 2 - EST-CE UNE ECRITURE, ET
< 3 - Y-A-T'IL SYNCHRONISATION SUR LE SEC-
< TEUR 0 DE CHAQUE PISTE ???
JNC FRDKM3 < OUI, CES 3 CONDITIONS SONT VERIFIEES,
< OR CETTE ECRITURE NE PORTE PAS SUR UNE
< FRONTIERE DE PISTE, L'ECHANGE NE PEUT
< DONC AVOIR LIEU SOUS PEINE D'ECRITURES
< ABERRANTES !!!
DKM51P: EQU $
LAI K
DV VAR+NBPPC < CONVERSION EN UN COUPLE (CYLINDRE,PISTE).
JNV SYSRBC
BSR ASYSER
<
< QUE FAIRE ???
< VERIFIER LA 'DCT'...
<
SYSRBC: EQU $
STB VAR+PIST < (B)=NUMERO DE PISTE,
STA VAR+CYL < (A)=NUMERO DE CYLINDRE.
<
< VALIDATION DU CYLINDRE DEMANDE :
< (APRES L'EXCLUSION, CAR EN EFFET,
< JUSTE AVANT DE SORTIR ON LIBERE
< LE SEMAPHORE...)
<
CPI MINCYL
JL FRDKM3 < INFERIEUR, ERREUR...
CP VAR+MAXCYL
HRDKM3: JG FRDKM3 < SUPERIEUR, ERREUR...
< (ET RELAI !!!)
<
< ALLOCATION D'UN JEU DE REGISTRES 'HDC' :
<
PSR X
LAD VAR+CCDKM
SVC SVCM4 < ALLOCATION D'UN CONTEXTE 'HDC'...
PLR X
IC VAR+XRHDCM < MEMORISONS QUE L'ON POSSEDE UN JEU...
<
< CONSTRUCTION PARTIELLE DU 'CCB' :
<
LA NSPTYP
TBT TYPAD < ADRESSE DE MOT OU D'OCTET ???
LA ARGDEM+AMDEM < (A)=ADRESSE ARGUMENT.
JC DKM12 < CAS DES ADRESSES DE MOT.
SLRS NOCMO=K < CAS DES ADRESSES D'OCTET.
DKM12: EQU $
STA VAR+CCDKN2 < (MOT2)=ADRESSE-MOT DU BUFFER.
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DU BUFFER,
ADRI NOCMO-E,A < ET ARRONDI A L'EVENTUEL MOT SUPERIEUR,
SLRS NOCMO=K < PUIS CONVERSION EN UN NOMBRE DE MOTS,
LR A,Y < (Y)=COMPTE DE MOTS DE L'ECHANGE.
LB VAR+INIDKM
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE :
XWOR%1: VAL FGR?FGW=K < DISCRIMINATION LECTURE/ECRITURE...
TBT NBITMO-B-XWOR%1 < EST-CE UNE LECTURE OU UNE ECRITURE ???
ADCR B < ET MEMORISATION...
STB VAR+CCDKM4 < (MOT4)=OPERANDE DE LA 'SIO' D'ECHANGE.
<
<
< I T E R A T I O N D E S E C H A N G E S A C H E V A L
< S U R D E S F I N S D E C Y L I N D R E :
<
DKM4: EQU $
<
< TEST DE PROTECTION DES GROUPES
< DE CYLINDRES (INFORMATION
< AMENEE PAR L'EVENTUELLE 'BOX'
< DE LA DEMANDE COURANTE) :
<
LBI NCYLP
ANCYLP:: VAL SUIDKM < A T T E N T I O N : ETANT DONNE QUE LA
< ZONE LOCALE DE 'DKU' EST PLEINE, ON EST
< OBLIGE DE METTRE EN RECOUVREMENT LES
< MOTS 'SUIDKM' ET 'ANCYLP' !!!
STB VAR+ANCYLP < INITIALISATION DE 'ANCYLP' ; NE PAS
< QUE 'ANCYLP' RECOUVRE 'SUIDKM' !!!
LA VAR+CYL < (A)=NUMERO DE CYLINDRE...
SARD NBITMO
DV VAR+ANCYLP
LR A,X < (X)=NUMERO DU GROUPE DE CYLINDRES AUQUEL
< APPARTIENT L'ECHANGE COURANT...
LA VAR+LSDK < (A)=LISTE D'APPROPRIATION GENERALE :
TBT L,X < LE GROUPE (X) EST-IL APPROPRIE ???
JNC DKM12Y < NON, DONC PAS DE PROBLEMES...
LA NSPTYP < OUI, DONC REGARDONS SI LA DEMANDE COU-
< RANTE TRANSMET UNE LISTE 'LUDKU' ???
TBT VBOX < (DANS LA 'BOX') ALORS ???
JNC DKM12Y < NON, RIEN A FAIRE...
LA BOX < OUI : (A)=LISTE D'APPROPRIATION DU DEMAN-
< DEUR (QUI EST DONC UN UTILISATEUR)...
TBT L,X < ALORS ???
JNC FRDKM3 < LE DEMANDEUR N'EST PAS PROPRIATAIRE DU
< GROUPE DE CYLINDRES DEMANDES, ERREUR...
DKM12Y: EQU $ < OK...
<
< PREVENTION PARTIELLE
< DES MEMOIRES INEXISTANTES :
<
BSR VAR+ASPDKM < DETECTION DES MEMOIRES INEXISANTES...
<
< INITIALISATION DE LA GESTION
< DES FINS DE CYLINDRE :
<
STZ VAR+SUIDKM < PAS DE SUITE A PRIORI...
<
< ECHANGE PROPREMENT DIT :
< (RAPPELONS QUE L'ECHANGE PEUT SE FAIRE EN PLUSIEURS FOIS
< SI LES SECTEURS A ECHANGER SONT A CHEVAL SUR PLUSIEURS
< CYLINDRE (EN FAIT 2 MAXIMUM PUISQUE LE COMPTE DE MOTS
< MAXIMUM EST '3FFF, ET QU'IL Y A 'F000 MOTS PAR CYLINDRE))
<
XXDK10:: VAL 1 < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
< DE 2**0) IGNOREES DANS L'ADRESSE TETE
< LORS DE LA SELECTION D'UNITE.
XXDK12:: VAL 3 < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
< CELLES QUI SONT IGNOREES) PRISES EN
< COMPTE LORS DE LA SELECTION D'UNITE.
XWOR%1: VAL BIT>XXDK12-BIT>XXDK10)MMOT
XXDK20:: VAL XWOR%1 < MASQUE DE SELECTION DES PUISSANCES UTILES
XXDK11:: VAL 7 < CADRAGE DES PUISSANCE UTILES LORS
< DE LA SELECTION D'UNITE.
XXDK13:: VAL 1 < NUMERO DE 'DKM' ET 'DKU' SUR LEURS
< COUPLEURS RESPECTIFS (PREMIERE UNITE).
XXDK14:: VAL 6 < POSITIONNEMENT DU NUMERO DE CYLINDRE
< LORS DU POSITIONNEMENT DES TETES.
XXDK15:: VAL XXDK14-XXDK10 < POSITION DES PUISSANCES LES PLUS FAIBLES
< LORS DU POSITIONNEMENT DES TETES.
XXDK30:: VAL MOMINI?MOMFBK?MOMSTR
< 'UNIT SELECT SANS IT ET CHECKSUM'.
XXDK31:: VAL MOMINI?MOMFBK?MOMINT
< 'SEEK AVEC IT VALIDEES'.
XXDK32:: VAL MOM8?MOM10?MOMSTR?MOMINT
< 'ECHANGE AVEC CHECKSUM'.
XXDK33:: VAL MOMRW?MOMSTR?MOMINT
< 'BEGIN WRITE'.
LA VAR+PIST < (A)=NUMERO DE PISTE,
IF XXDK10-1,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
RBT NBITMO-XXDK10
SLLS NBITMO-XXDK12-XXDK10
SLRS NBITMO-XXDK12-XXDK10-XXDK11 < TETE (BITS DE POIDS 1,2,3).
SBT XXDK13 < MISE EN PLACE DU NUMERO DE L'UNITE DE
< DISQUE SUR CE COUPLEUR (EN FAIT, ICI,
< UN 'DRIVE' PAR COUPLEUR...),
SIO VAR+ASDKM < ET ENVOI DE LA FONCTION 'SORTIE ADRESSE'.
LXI -XXDK6T
BSR ADODO < AFIN D'EVITER DES PERTES ALEATOIRES
< DU READY, ON ESPACE LES 'SIO' !!!
LAI XXDK30
SIO VAR+CDDKM < ENVOI DE LA FONCTION 'UNIT SELECT',
< SANS INTERRUPTION ET AVEC CHECKSUM.
LXI -XXDK6T
BSR ADODO < AFIN D'EVITER DES PERTES ALEATOIRES
< DU READY, ON ESPACE LES 'SIO' !!!
DKM4X: EQU $
SIO VAR+EADKM < (A)=MOT D'ETAT 'A' :
TBT ETADEF < Y-A-T'IL UN DEFAUT ???
JC DKM4XX < OUI, ON VA FAIRE UN RESET...
TBT ETAOPE < NON, LE DISQUE EST-IL PRET ???
JC DKM41 < OUI, ON PEUT FAIRE L'ECHANGE...
DKM4XX: EQU $ < NON,EXECUTION D'UN RESET SUR LE DISQUE...
LAI MOMINI?MOMINT
SIO VAR+CDDKM < RETOUR DU BRAS SUR LE CYLINDRE 0 ; ON
< ESPERE AINSI, PAR EXEMPLE CHASSER LES
< PETITES POUSSIERES AVEC UN COURANT
< D'AIR (AVEC CHECKSUM)...
BSR ACSWIT < ET ATTENTE DE L'INTERRUPTION DE FIN
< D'OPERATION...
JMP DKM4X < PUIS, ON RETESTE L'ETAT...
DKM3R: JMP DKM3 < RELAI...
FRDKM3: JMP ERDKM3 < RELAI...
DKM4R: JMP DKM4 < RELAI (ET OUI, ENCORE UN !!!)...
<
< CAS OU LE DISQUE EST PRET :
<
DKM41: EQU $
LBI K
LA VAR+CYL < (A)=NUMERO DE CYLINDRE,
XWOR%1: VAL CAXCYL=K
IF BIT>XWOR%1-CAXCYL,,XEIF%,
IF ATTENTION : 'CAXCYL' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
SLRD XWOR%1 < DECONCATENATION :
LR A,X < (X)=NUMERO DU GROUPE VIRTUEL,
LBY &VAR+ATVDKM < (A)=NUMERO DU GROUPE REEL.
CPI MINCYL < ET VALIDATION :
JL DKM41X < BERK ?!??!?!
CP VAR+MAXCYL < ET VALIDATION :
JLE DKM41Y < OK...
DKM41X: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< REGARDER LES TABLES DE VIRTUALISATION...
<
LR X,A < ET ON RESTAURE :
< (A)=NUMERO DE GROUPE VIRTUEL.
DKM41Y: EQU $
SLLD XWOR%1 < ET ON RECONCATENE...
SLLS XXDK14
LR A,X
LA VAR+PIST < (A)=NUMERO DE PISTE,
ANDI XXDK20 < SELECTION DES BITS DE POIDS 0 ET 4 DE
< L'ADRESSE DE LA TETE.
SLRD XXDK10
SLLS NBITMO-XXDK12-XXDK10-XXDK15-XXDK10
SLLD XXDK15+XXDK10
ORR X,A
SIO VAR+ASDKM < ENVOI DE LA FONCTION 'SORTIE ADRESSE
< SECTEUR'...
AD VAR+SECT < (A)='HEADER 1' DU PREMIER SECTEUR A
< ECHANGER,
STA VAR+CCDKM5 < (MOT5)='HEADER 1' DU PREMIER SECTEUR.
LAI XXDK31
SIO VAR+CDDKM < ENVOI DE LA FONCTION 'SEEK', AVEC LES
< INTERRUPTIONS VALIDEES ET LE CHECKSUM.
BSR ACSWIT < ET ATTENTE DE L'INTERRUPTION DE FIN...
BSR ATHDS < Y-A-T'IL EU UN DEFAUT SECTEUR ENTRE
< TEMPS ???
JC DKM4 < OUI, ON RECOMMENCE...
STY VAR+CCDKM3 < NON,
< (MOT3)=COMPTE DE MOTS RESIDUELS...
LAD VAR+CCDKM < (A)=ADRESSE DU 'CCB',
PSR X
SVC SVCM6 < ET EXTENSION D'ADRESSE SUR 20 BITS...
PLR X
BSR ASDIPI < ENVOI DU 'CCB' A L''IOP'...
LA VAR+DSYNC0
TBT CCBDKM < Y-A-T'IL SYNCHRONISATION SUR LE
< SECTEUR 0 ???
LAI XXDK32 < 'ECHANGE AVEC CHECKSUM' A PRIORI...
JC DKM42X < NON, MODE NORMAL...
<
< BOUCLE DE SYNCHRONISATION SUR LE SECTEUR 0 :
<
DKM42Y: EQU $
SIO VAR+EADKM < ENTREE DU MOT D'ETAT 'A',
TBT ETAS0 < EST-ON SUR LE SECTEUR 0 ???
JNC DKM42Y < NON, ON L'ATTEND ACTIVEMENT...
LAI XXDK33 < 'BEGIN WRITE'...
<
< ECHANGE PROPREMENT DIT :
<
DKM42X: EQU $
SIO VAR+CDDKM < LANCEMENT ECHANGE PAR UNE 'SIO'
< D'ECHANGE...
BSR ACSWIT < ET ATTENTE DE L'INTERRUPTION DE FIN
< D'ECHANGE...
< RAPPEL : LES MOTS D'ETAT 'A' ET 'B' SONT
< STOCKES DANS 'ETAT0' ET 'ETAT1' DE LA
< 'DCT' PAR 'ARIT'...
BSR ATHDS < EST-CE UNE VRAIE INTERRUPTION, OU BIEN
< UN DEFAUT SECTEUR ???
JC DKM4 < C'EST UN DEFAUT SECTEUR, IL EST DONC PLUS
< PRUDENT DE RELANCER L'ECHANGE...
LA ETAT0 < C'EST UNE VRAIE INTERRUPTION :
< (A)=MOT D'ETAT 'A' :
JAGE DKM42 < OK, ALLONS VOIR LE COMPTE-RENDU...
<
< CAS OU IL Y A AU MOINS UN DEFAUT :
<
TBT ETACAD < EST-CE L'ERREUR DE CADENCE ???
JC ERDKM5 < OUI...
TBT ETAPAR < EST-CE UN CHECKSUM ???
JC ERDKM5 < OUI...
TBT ETAVIO < EST-CE UN VIOL ???
JC ERDKM5 < OUI...
TBT ETADOG < EST-CE UN CHIEN DE GARDE (OUAH, OUAH) ???
JC ERDKM5 < OUI...
TBT ETAOPE < LE DISQUE EST-IL PRET ???
JNC ERDKM5 < NON, ERREUR...
TBT ETABRK < OUI, EST-CE UN FIN DE CYLINDRE ???
JNC ERDKM5 < NON, ERREUR...
IC VAR+SUIDKM < OUI, C'EST UNE FIN DE CYLINDRE
< IL VA Y AVOIR VRAISEMBLABLEMENT
< UNE SUITE ; PASSONS AU COMPTE-RENDU...
< COMPTE RENDU
DKM42: EQU $
<
< COMPTE-RENDU D'ECHANGE :
<
LA VAR+CCDKM0
SBT BCCBCR
STA VAR+CCDKM0 < MISE DU 'CCB' EN MODE COMPTE-RENDU...
LAD VAR+CCDKM
BSR ASDIPI < DEMANDE DE COMPTE-RENDU A L''IOP' :
LA VAR+CCDKM3 < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
< COMPTE-RENDU DU CANAL 'HDC' SUR
< LES BITS 0-1 POUR L'ETAT, ET 2-15
< POUR LE COMPTE DE MOTS RESIDUELS :
< SIGNIFICATION DES BITS 0-1 :
< =00 : OK, TOUT S'EST BIEN PASSE,
< =01 : L'ECHANGE S'EST ARRETE SUR UN
< DEFAUT SECTEUR, OU UN 'INI',
< =10 : UNE PARITE MEMOIRE A ETE RENCON-
< TREE AU COURS DE L'ECHANGE,
< =11 : UNE MEMOIRE INEXISTANTE A ETE
< RENCONTREE AU COURS DE L'ECHANGE.
< LES BITS 2-15, QUANT A EUX, DONNENT LE
< COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
< GE (NORMALEMENT NUL...).
JAE DKM2 < OK, TOUT S'EST BIEN PASSE...
<
< CAS OU CELA S'EST MAL PASSE :
<
TBT BCCBME < Y-A-T'IL EU UN PROBLEME MEMOIRE ???
JC ERDKM5 < OUI...
TBT BCCBDC < Y-A-T'IL EU UN DEFAUT SECTEUR ???
JC ERDKM5 < OUI...
CPZ VAR+SUIDKM < NON, MAIS Y-A-T'IL EU UN INTERRUPTION
< DE FIN DE CYLINDRE ???
JNE DKM70 < MAIS OUI, MON BON MONSIEUR...
ZZDKM: EQU $ < COLMPTE DE MOTS RESIDUELS NON NUL
< SANS INTERRUPTION DE FIN DE CYLINDRE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< NOTER LES ADRESSES, ET VERIFIER
< QU'IL N'Y A PAS EU DE FIN DE CYLINDRE,
< ET RELANCER...
<
<
< CAS OU LE COMPTE DE MOTS RESIDUELS EST NON NUL,
< PREPARATION DE L 'ECHANGE SUIVANT :
<
DKM70: EQU $
SBR A,Y < (Y)=NOMBRE DE MOTS DEJA ECHANGES,
LR Y,A < (A)=NOMBRE DE MOTS DEJA ECHANGES.
LBI K < CLEAR REGISTRE 'B'.
XWOR%1: VAL YY7 < NOMBRE DE MOTS PAR SECTEUR.
XWOR%2: VAL XWOR%1=K
SLRD XWOR%2 < (A)=NOMBRE DE SECTEURS DEJA ECHANGES.
CPZR B < CE NOMBRE DOIT ETRE ENTIER !!!
JE DKM71 < OUI, OUF !!!
ZZZDKM: BSR ASYSER < E R R E U R S Y S T E M E ...
< CAS OU LE NOMBRE DE MOTS DEJA ECHANGES.
< N'EST PAS UN NOMBRE ENTIER DE SECTEURS.
<
< QUE FAIRE ???
< BIEN NOTER LES ADRESSES, VERIFIER
< LES CALCULS, PUIS RELANCER COMME
< SUIT...
<
XR A,B
SLRS NBITMO-XWOR%2 < (A)=NOMBRE DE MOTS ECHANGES EN TROP,
SBR A,Y < (Y)=NOMBRE DE MOTS DEJA ECHANGES DANS
< UN NOMBRE ENTIER DE SECTEURS.
AD VAR+CCDKM3 < ET CALCUL DU NOMBRE REEL DE MOTS ENCORE
STA VAR+CCDKM3 < A ECHANGER, ET MISE A JOUR DU 'CCB'...
XR A,B
DKM71: EQU $
AD VAR+SECT
SLRD NBITMO
DV VAR+NBSRPP < POUR CHANGER DE PISTE EVENTUELLEMENT.
STB VAR+SECT < PROCHAIN SECTEUR A ECHANGER.
AD VAR+PIST
SLRD NBITMO
DV VAR+NBPPC < POUR CHANGER DE CYLINDRE EVENTUELLEMENT.
STB VAR+PIST < PROCHAINE PISTE A ECHANGER.
AD VAR+CYL
STA VAR+CYL < PROCHAIN CYLINDRE A ECHANGER.
LA VAR+CCDKN2 < ANCIENNE ADRESSE BUFFER,
ADR Y,A < QUE L'ON FAIT PROGRESSER,
STA VAR+CCDKN2 < NOUVELLE ADRESSE BUFFER...
LY VAR+CCDKM3 < (Y)=NOUVEAU COMPTE DE MOTS RESIDUEL.
JMP DKM4R
DKM2: EQU $
<
<
< S O R T I E D U H A N D L E R :
<
<
STZ ETAT0
DKM3: EQU $
<
< LIBERATION EVENTUELLE D'UN
< JEU DE REGISTRE 'HDC' :
<
CPZ VAR+XRHDCM < A-T'ON UN JEU DE REGISTRES ???
JE DKM3X < NON, RIEN A RENDRE (CAS DES ERREURS
< DE DEBUT...).
STZ VAR+XRHDCM < MEMORISONS QUE L'ON REND CE JEU...
PSR X
LAD VAR+CCDKM
SVC SVCM5 < DESALLOCATION DU CONTEXTE 'HDC'...
PLR X
DKM3X: EQU $
JMP DKME1 < (ANCIEN 'RSR') VERS LA GESTION DES
< DEMANDES D'ENTRELACAGES DES LECTURES
< RAPIDES SUR 'DKU'...
<
<
< E R R E U R S S O F T S :
<
<
ERDKM4: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
ERDKM3: EQU $ < COMPTE DE MOTS INVALIDE.
LBY VAR+NMMDKM < ON RENVOIE LE NOMBRE MAXIMUM DE MOTS
< ECHANGEABLES/YY8 POUR FAIRE
< COMME DANS 'DKF', MAIS ICI, CELA NE
< SERT A RIEN...
DKM72: EQU $
SBT NBITMO-B < SOMME DES DEFAUTS SOFT,
STA ETAT0 < (ETAT0)=CODE D'ERREUR...
JMP DKM3 < VERS LA SORTIE...
<
<
< E R R E U R S H A R D S :
<
<
ERDKM5: EQU $
LA ETAT0 < DANS LE CAS OU L'ON ARRIVE ICI (ERREUR
< HARD, OU BIZARRERIE DE MOTS RESIDUELS),
PSR A < SAVE LE MOT D'ETAT DU DEFAUT...
BSR ACANSP < MAIS QUI EST LA ???
< (A)='NSP' DU DISQUE EN DEFAUT :
CPI NSPDKM < EST-CE 'DKM' ???
JE ERDKMY < OUI, DANS LE CAS DU DISQUE SYSTEME 'DKM'
< ON FAIT SYSTEMATIQUEMENT LE "RETURN TO
< ZERO TRACK" POUR DONNER UN AVERTISSEMENT
< SONORE...
LA MEMV < NON, C'EST 'DKU' :
TBT XSYNC0 < ICI, ON FAIT UN PETIT TRUANDAGE, DESTINE
< A POUVOIR CONTROLER LE "RETURN TO ZERO
< TRACK" A L'AIDE D'UN INDICATEUR, ALORS
< QU'IL N'Y EN A PAS DE LIBRE ; ALORS ON
< UTILISE CELUI DE LA SYNCHRONISATION SUR
< LE SECTEUR 0 DE CHAQUE PISTE...
JC ERDKMX < EFFECTIVEMENT, ON NE FAIT PAS DE RETOUR
< A 0 POUR FACILITER LES TRANSFERTS RAPIDES
< 'MEMTV' <--> 'DKU'...
ERDKMY: EQU $
LAI MOMINI?MOMSTR?MOMINT
SIO VAR+CDDKM < "RETURN TO ZERO TRACK"...
< (POUR FAIRE DU VENT : EN EFFET CE MOUVE-
< MENT RAPIDE DES TETES PEUT DEPLACER
< D'EVENTUELLES POUSSIERES...)
BSR ACSWIT < ET ATTENTE DE FIN D'OPERATION.
ERDKMX: EQU $
PLR A < RESTAURE : (A)=MOT D'ETAT DU DEFAUT...
JMP DKM72 < ON FORCE LE BIT0(ETAT0) AFIN DE LANCER
< UN RETRY...
<
<
< C A S D E S S E C T E U R S I N E X I S T A N T S :
<
<
DKMGS: EQU $
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE,
XWOR%1: VAL FGR?FGW=K
TBT NBITMO-B-XWOR%1 < DISCRIMINATION DES LECTURES/ECRITURES :
JC DKM2 < LES ECRITURES SONT SANS EFFETS...
<
< INITIALISATION D'UN BUFER EN LECTURE :
<
LX ARGDEM+CODEM < (X)=NOMBRE D'OCTESTS DESIRES...
LA ARGDEM+ASDEM
SWBR A,B
ANDR A,B < (B)=MOT=DOUBLE-OCTET A REPETER...
LA ARGDEM+AMDEM
SLRS NOCMO=K
PSR W
LR A,W < (W)=ADRESSE MOT DU BUFFER.
<
< BOUCLE DE TRAITEMENT D'UN Q-SECTEUR :
<
DKMGS1: EQU $
LRM Y
WORD YY7Q < (Y)=LONGUEUR MOTS D'UN Q-SECTEUR.
DKMGS2: EQU $
STB O,W < INITIALISATION DU BUFFER PAR MOTS,
< COMME LE FERAIT UNE ENTREE-SORTIE...
ADRI P,W < AU MOT SUIVANT...
ADRI -I*NOCMO,X < DECOMPTE DES OCTETS TRAIES,
ADRI -I,Y < DECOMPTE DES MOTS DANS LE Q-SECTEUR,
CPZR X < L'ENTREE-SORTIE EST-ELLE FINIE ???
JLE DKMGS3 < OUI, ON SORT...
CPZR Y < NON, A-T'ON EPUISE LE Q-SECTEUR COURANT ?
JNE DKMGS2 < NON, ON CONTINUE...
ADRI I,B < OUI, PASSAGE A LA VALEUR
SWBR B,B < D'INITIALISATION
ADRI I,B < SUIVANTE...
JMP DKMGS1 < ET AU Q-SECTEUR SUIVANT...
<
< FIN DU PROCESSUS :
<
DKMGS3: EQU $
PLR W < RESTAURE (W)=ADRESSE DE LA DEMANDE,
JMP DKM2 < ET VERS LA SORTIE...
PAGE
<
<
< G E S T I O N D E L ' E N T R E L A C A G E
< D E S L E C T U R E S R A P I D E S ' D K U ' :
<
<
< FONCTION :
< CE MODULE MIS ICI A CAUSE DES
< FABULEUX SAUTS DE LA MORT (SOUS-
< ENTENDU, SUPERIEURS A 128 MOTS...)
< PERMET A LA FIN DU HANDLER DISQUE
< AMOVIBLE, DE REGARDER SI UN ENTRE-
< LACAGE EST A REALISER... CECI NE
< PEUT SE PRODUIRE QUE POUR 'DKU' LORS
< DES TRNASFERTS RAPIDES 'DKU'-->'MEMTV',
< S'IL Y EU UNE COMMANDE "!DKU S"
< EMISE...
<
<
DKME1: EQU $
<
< TEST SUR LA NECESSITE D'ENTRELACER :
<
LA ARGDEM+OPDEM < (A)=FONCTION COURANTE :
CPI FONTVR < EST-CE LE TRANSFERT RAPIDE 'DKU'-->
< 'MEMTV' ???
JNE DKME2 < NON, RIEN A FAIRE, ON SORT...
CPZ ETAT0 < OUI, ALORS L'OPERATION S'EST-ELLE CORREC-
< TEMENT REALISEE ???
JNE DKME2 < NON, DONC ON SORT...
XWOR%1: VAL COSBT?FONTVR=FMASK(K?XXDK5=FCINST
IF XWOR%1-XXDK5,XEIF%,,XEIF%
IF ATTENTION : POUR QUE CES TESTS FONCTIONNENT
IF CORRECTEMENT, IL FAUT QUE 'DKM' NE POSSEDE
IF PAS UNE FONCTION VALANT 'FONTVR' !!!
XEIF%: VAL ENDIF
BSR ACANSP < COMME ON N'EST JAMAIS ASSEZ PRUDENT :
< (A)='NSP' DU HANDLER COURANT,
CPI NSPDKU < EST-CE BIEN 'DKU' ???
JE DKME5 < OUI, OUF...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ELIMINER LA FONCTION A 'DKM' QUI
< VAUT 'FONTVR' ET QUI EST BIZARREMENT
< PASSEE INAPERCUE !!!
<
JMP DKME2 < ET IL VAUT MIEUX SORTIR...
DKME5: EQU $
XWOR%1: VAL TVLIMA*LK*XNCOOL*NOCMO
LRM A
WORD XWOR%1 < (A)=LONGUEUR D'UNE IMAGE COULEUR ENTIERE,
CP ARGDEM+CODEM < 'FONTVR' A-T'IL PORTE SUR UNE IMAGE
< COULEUR ENTIERE ???
JNE DKME2 < NON, PAS D'ENTRELACAGE...
LA NSPTYP
TBT TYPAD < EST-CE BIEN UNE ADRESSE-MOT ???
JNC DKME2 < NON, PAS D'ENTRELACAGE...
PSR W < OUI,
CALL #SISP CMS5 W ZERO#
< (W)=BASE DE LA MEMOIRE DEBANALISEE,
CPZ TVENTR-ZERO,W < Y-A-T'IL UNE COMMANDE "!DKU S" EN COURS ?
PLR W
JE DKME2 < NON "!DKU F", DONC PAS D'ENTRELACAGE...
IF AMEMTV-ZERO,,XEIF%,
IF ATTENTION : LE TEST ('CPZ') CI-DESSUS EST IDIOT !!!
XEIF%: VAL ENDIF
<
< APRES TOUTES CES VERIFICATIONS (...),
< ON SAIT QUE L'IMAGE LUE A PARTIR DE
< 'DKU' EST COMPLETE, ET QU'IL FAUT
< L'ENTRELACER, CE QUE L'ON VA FAIRE :
<
XWOR%2: VAL XWOR%1/XNCOOL/LENTR/NOCMO
< NOMBRE D'ITERATIONS D'ENTRELACAGE.
XWOR%3: VAL -DADR
XWOR%3: VAL -XWOR%3 < POUR CONVERTIR DES ADRESSES DE MOTS EN
< DES FADR-ADRESSES...
XWOR%4: VAL AMEMTV-ZERO>XWOR%3+MEMTV0
XWOR%5: VAL AMEMTW-ZERO>XWOR%3+MEMTV0+XXLTV-E
CALL #SISP CMS5 PSRSLO#
PSR W < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE
< COURANTE.
LRM A,B,X,W
WORD XWOR%4 < (A)=ADRESSE DU DEBUT DE L'IMAGE VISUALISE
WORD XWOR%5 < (B)=ADRESSE DE FIN DE L'IMAGE INTERME-
< DIAIRE A ENTRELACER...
<+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DKMBL1: WORD XWOR%2 < (X)=NOMBRE DE BLOCS A ENTRELACER,
DKMBL2: WORD LENTR < (W)=LONGUEUR DES BLOCS ENTRELACES.
< NOTA : CE SONT CES 2 MOTS QUI SONT A
< MODIFIER SI L'ON SOUHAITE CHANGER
< LA LONGUEUR DES BLOCS, SANS TOUTE
< FOIS DEPASSER 'LBENTR'...
<+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BSR VAR+ATWOED < POSITIONNEMENT DE (SLO,SLE) AFIN DE
< FAIRE L'ENTRELACAGE DANS 'MEMTV'.
LR W,A < (A)=LONGUEUR DES BLOCS,
CPI LBENTR < VALIDATION VICIEUSE AU CAS OU CETTE
< LONGUEUR AURAIT ETE PATCHEE...
JLE DKME6 < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< MODIFIER CETTE LONGUEUR ET LE NOMBRE
< D'ITERATIONS AVANT DE RELANCER...
<
DKME6: EQU $
LRM A,B,Y
WORD AMEMTW < (A)=ADRESSE DE LA SOURCE 'SLAVE',
WORD BENTR < (B)=ADRESSE DU RECEPTEUR/EMETTEUR
< 'MASTER',
WORD AMEMTV < (Y)=ADRESSE DU RECEPTEUR 'SLAVE'.
<
< BOUCLE D'ITERATIONS SUR LES
< XNCOOL-BLOCS :
<
DKME3: EQU $
IF BITX-BITSIG,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ VAR+ALINHI < DOIT-ON UTILISER LE SYSTEME D'AUTORISA-
< TION/INHIBITION DES BLOCS ENTRELACES ???
JGE DKME8 < NON, ON NE TESTE PAS LES INHIBITIONS...
PSR A,X,Y < OUI :
LAD VAR+ALINHI < (A)=ADRESSE DU RELAI VERS 'LINHIB',
ADRI L-IJIJDX,X < (X)=INDEX DU BIT A TESTER (ON RETRANCHE
< 'IJIJDX' PARCEQUE LA BOUCLE
< 'DKME3' EST CONTROLEE PAR UN 'JDX') ;
< NE PAS OUBLIER QUE LA LISTE EST DANS
< L'ORDRE INVERSE...
LYI FONTB < (Y)=FONCTION DE TEST BIT...
BSR ATMOBT < ET TEST DU BIT (X) DANS LA TABLE ((A)) :
PLR A,X,Y
JNC DKME7 < LE BLOC COURANT EST INHIBE...
DKME8: EQU $ < LE BLOC COURANT EST AUTORISE, OU BIEN
< CE MECANISME N'EST PAS UTILISE...
PSR A,X,Y < SAUVEGARDE ENTRE AUTRES DES ADRESSES
< SOURCE/RECEPTEUR 'SLAVE'.
LXI XNCOOL < (X)=NOMBRE DE COULEURS,
<
< ITERATION SUR CHAQUE COULEUR
< A L'INTERIEUR D'UN XNCOOL-BLOC :
<
DKME4: EQU $
PSR X < SAVE DU DECOMPTE DES ITERATIONS,
LR W,X < (X)=LONGUEUR D'UN BLOC,
MVTM < TRANSFERT 'AMEMTW' --> 'BENTR',
XR A,Y < CHANGEMENT DES
XR A,B < EMETTEURS/RECEPTEURS...
LR W,X < (X)=LONGUEUR D'UN BLOC,
MVTS < TRANSFERT 'BENTR' --> 'AMEMTV'.
XR A,B < RETABLISSEMENT DES
XR A,Y < EMETTEURS/RECEPTEURS...
LRM X
WORD TVLIMA*LK < (X)=CONSTANTE DE PASSAGE D'UNE COMPOSANTE
< CHROMATIQUE A LA SUIVANTE...
ADR X,A < PASSAGE A LA SOURCE 'SLAVE' SUIVANTE,
ADR X,Y < ET AU RECEPTEUR 'SLAVE' SUIVANT...
PLR X
JDX DKME4 < VERS LE BLOC CHROMATIQUE SUIVANT...
PLR A,X,Y < RESTAURATION ENTRE AUTRES DES ADRESSES
< SOURCE/RECEPTEUR 'SLAVE'...
DKME7: EQU $ < CAS DES BLOC INHIBES...
ADR W,A < PASSAGE AU BLOC SOURCE 'SLAVE' SUIVANT,
ADR W,Y < ET RECEPTEUR 'SLAVE' SUIVANT...
JDX DKME3 < AU XNCOOL-BLOC SUIVANT...
PLR W < RESTAURE :
< (W)=ADRESSE DE LA DEMANDE COURANTE.
CALL #SISP CMS5 PLRSLO#
<
< RESTAURATION DE LA DEMANDE
< SUITE A UN ENTRELACAGE :
<
STZ ARGDEM+AMDEM < L'ADRESSE ETAIT NULLE,
LA NSPTYP
RBT TYPAD < ET D'OCTETS...
STA NSPTYP
<
<
< S O R T I E D U H A N D L E R :
<
<
DKME2: EQU $
RSR < ET C'EST TOUT...
PAGE
<
<
< D E T E C T I O N D E S M E M O I R E S
< I N E X I S T A N T E S :
<
<
< FONCTION :
< CE SOUS-PROGRAMME, UTILE POUR
< 'DKU', DETECTE AU DELA DE 64K LES
< MEMOIRES INEXISTANTES ; EN EFFET,
< LORSQUE L'ON UTILISE LES TRANSFERTS
< RAPIDES ENTRE 'DKU' ET 'MEMTV', SI
< C'EST 'PROESC' QUI EST LE 'PROIOP',
< ET SI POUR TERMINER LE COUPLEUR DE
< BUS EST DECONNECTE, 'PROESC' ETANT
< SOUS NIVEAU 'TH0', CELA PROVOQUERAIT
< UNE ALARME !!! ICI DONC ON FAIT UN TEST
< PRELIMINAIRE DE CE TYPE DE MEMOIRE
< INEXISTANTE...
<
<
SPDKU: EQU $
PSR A,B,Y
LA VAR+DSYNC0
ANDI CCBMAE < (A)=EXTENSION D'ADRESSE,
JAE SPDKU1 < AUCUN TEST A FAIRE...
LR A,Y < (Y)=EXTENSION D'ADRESSE...
CALL #SISP CMS5 PSRSLO#
< SAUVEGARDE DE 'SLO' ET 'SLE'...
XWOR%1: VAL 1 < NOMBRE DE 'DADR'-MOTS A TESTER...
XWOR%2: VAL CCBMAE=K < CADRAGE DE 'CCBMAE'.
XWOR%4: VAL -DADR
XWOR%5: VAL BIT>XWOR%4-BIT)MMOT
XWOR%5: VAL COSCLS?XWOR%2=FMASK(K?XWOR%5=FCINST
LA VAR+CCDKN2 < (A)=ADRESSE MOT DE L'ECHANGE A L'INTERIEU
< D'UN SEGMENT DE 64K,
IF XWOR%2-K,,XEIF%,
SCLS XWOR%2 < CADRAGE COMPATIBLE AVEC L'EXTENSION,
XEIF%: VAL ENDIF
ANDI XWOR%5 < SUPPRESSION DES -'DADR' BITS DE POIDS
< FAIBLES,
ORR Y,A < CONCATENATION DE L'EXTENSION,
SCRS -DADR+XWOR%2 < (A)=ADRESSE EN 'DADR'-MOTS DE L'ECHANGE,
LR A,B
ADRI XWOR%1,B < PASSAGE UN 'DADR'-MOTS PLUS LOIN...
WOE < INITIALISATION DE 'SLO' ET 'SLE',
LAI COSBT?DEBUG=FMASK(K=FCINST
BSR ASMMK < MASQUAGE DES INTERRUPTIONS, CAR
< ON VA PASSER EN MODE 'DEBUG'...
SST < PASSAGE EN MODE 'DEBUG'.
SPDKU3: EQU $
XWOR%3: VAL -DADR
LYI XWOR%1>XWOR%3-D < (Y)=ADRESSE DU PREMIER MOT A TESTER
< DANS L'ESPACE (SLO,SLE).
DBP < RECHERCHE DES DEFAUTS...
JNV SPDKU2 < OK, IL N'Y A PAS DE MEMOIRE INEXISTANTE,
< MAIS IL PEUT Y AVOIR UNE PARITE, CE
< QUI PEUT ETRE INDIFFERENT, DANS LA MESURE
< OU CELA PEUT SE RENCONTRER APRES UNE
< ENTREE CAMERA, SUIVIE IMMEDIATEMENT D'UN
< TRANSFERT 'DKU' <--> 'MEMTV'...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VERIFIER LA CONNEXION DU COUPLEUR
< DE BUS VERS 'MEMTV', ET EN GENERAL
< ITERER LE TEST !!!
<
JMP SPDKU3 < ET ON RETESTE...
SPDKU2: EQU $
LAI COSBT?DEBUG=FMASK(K=FCINST
RST < ET ON EFFACE LE MODE 'DEBUG'...
BSR ASMDK < ET ON DEMASQUE LES INTERRUPTIONS.
< RESTAURATION DE (SLO,SLE) :
CALL #SISP CMS5 PLRSLO#
SPDKU1: EQU $
PLR A,B,Y
<
< SORTIE, ET ENTRY 'DKM' :
<
SPDKM: EQU $
RSR
PAGE
<
<
< E X T E N S I O N D E S ' C D A ' :
<
<
< FONCTION :
< CE SOUS-PROGRAMME EST DESTINE
< A REMPLACER LES ANCIENS 'WOE'
< QUI PERMETTAIENT DE SE POSITIONNER
< SUR 'MEMTV' (C'EST-A-DIRE LA 'CDAI') ;
< DORENAVANT, TOUTES CES OPERATIONS
< PEUVENT ATTEINDRE L'ENSEMBLE DES
< 'CDA' DU SYSTEME ; 'HDLDKU' RECOIT
< A CET EFFET, DANS LE CAS DE CES
< FONCTIONS, NON PAS (SLO,SLE) DE
< L'UTILISATEUR DANS LES REGISTRES
< (SLO,SLE), MAIS (CDESCO,CDESCE) QUI
< DEFINISSENT LA 'CDA' COURANTE...
<
<
< NOTA :
< ON NE PEUT EN GENERAL APPELER
< DIRECTEMENT 'TWOE' DEPUIS 'HDLDKU',
< CAR LA PLUPART DU TEMPS, LA BASE
< 'C' EST MAUVAISE...
<
<
< ARGUMENTS :
< (A,B)=REGISTRES 'SLO' ET 'SLE'
< DEMANDES SUR L'ANCIENNE 'CDAI'...
<
<
TWOED: EQU $
PSR C
CALL #SISP CMS5 BASE C#
< ET OUI, EN EFFET, LA BASE 'C' EST EN
< GENERAL MAUVAISE !!!
BSR ATWOE < VERS L'EXTENSION DES 'CDA'...
PLR C
RSR < ET RETOUR...
PAGE
<
<
< A U T O R I S A T I O N D E T O U S L E S
< B L O C S E N T R E L A C E S :
<
<
< FONCTION :
< POUR DES RAISONS ECONOMIQUES,
< ON A GROUPE LES BLOCS ENTRELACES
< EN 'NBITMO' GROUPES DE CHACUN
< 'LLINHI*NBITMO/LVALES'='LLINHI'
< GROUPES ENTRELACES.
< CE PREMIER MODULE, AUTORISE
< TOUS LES GROUPES DE BLOCS, ET
< DESARME CE MECANISME (PAR LE
< BIT D'INDEX DE 'ALINHI').
<
<
< NOTA :
< IL N'EST PAS NECESSAIRE DE
< CREER DES PHASES CRITIQUES,
< PUISQUE L'APPEL DE 'PSLOWA'
< IMPLIQUE QUE L'UTILISATEUR
< SOIT ASSIGNE LE DISQUE...
<
<
< ARGUMENTS :
< (B)='NSP' DU DISQUE.
<
<
PSLOWA: EQU $
PSLOWB: EQU PSLOWA < (A CAUSE DE L'ASSEMBLEUR...)
PSR B,X,L
<
< POSITIONNEMENT SUR LE
< DISQUE ARGUMENT :
<
LR B,X < (X)='NSP' DU DISQUE,
BSR ACADCT < (A)=(L)=ADRESSE DE LA 'DCT' DU DISQUE.
<
< AUTORISATION DE TOUS LES
< BLOCS ENTRELACES :
<
LA VAR+ALINHI
SBT BITX
STA VAR+ALINHI < AFIN D'INITIALISER LA LISTE PAR MOTS...
LXI LLINHI < (X)=NOMBRE DE MOTS DE LA LISTE,
LBI MMOT < (B)=POUR AUTORISER...
PSLOW1: EQU $
STB &VAR+ALINHI < ET ON AUTORISE
JDX PSLOW1 < TOUS LES BLOCS...
<
< ET DESARMEMENT DU MECANISME :
<
RBT BITX
STA VAR+ALINHI < ET ON CLEAR LE BIT INDEX DE 'ALINHI'...
<
< RETOUR :
<
PLR B,X,L
RSR
<
<
< I N H I B I T I O N S E L E C T I V E D E
< G R O U P E S D E B L O C S E N T R E L A C E S :
<
<
< FONCTION :
< POUR DES RAISONS D'ECONOMIE
< CETTE INHIBITION NE PEUT SE
< FAIRE QUE PAR GROUPE DE BLOCS
< (DE 'LLINHI' BLOCS), AFIN QUE
< LISTE COMMUNIQUEE PAR L'UTILI-
< SATEUR TIENNE SUR UN MOT...
<
<
< NOTA :
< PAS DE PHASES CRITIQUES PUISQUE
< L'APPEL DE 'PSLOWI' IMPLIQUE UNE
< ASSIGNATION PREALABLE DU DISQUE...
<
<
< ARGUMENTS :
< (B)='NSP' DU DISQUE,
< (VALESC)=LISTE DES GROUPES DE BLOCS
< ENTRELACES INHIBES (0) OU
< INHIBES (1) DANS LE BON
< ORDRE (RAPPELONS QUE 'LINHIB'
< EST RANGEE A L'ENVERS...).
<
<
PSLOWI: EQU $
PSR B,X,L
<
< POSITIONNEMENT SUR LE DISQUE :
<
LR B,X < (X)='NSP' DU DISQUE,
BSR ACADCT < (A)=(L)=ADRESSE DE SA 'DCT'...
<
< ACCES A LA LISTE ARGUMENT :
<
LA VALESC-DCTESK,W < (A)=LISTE ARGUMENT,
EORI MMOT < QUE L'ON INVERSE AFIN DE DETECTER
< LES INHIBITIONS (0 --> 1),
LBI K < CLEAR DE 'B' POUR LE TEST D'ARRET...
<
< RECUPERATION DE CHAQUE
< GROUPE DE BLOCS INHIBES :
<
PSLOW2: EQU $
DBT < RECHERCHE DU GROUPE DE BLOCS INHIBES
< COURANT,
JC PSLOW4 < C'EST FINI ; NOTONS QUE 'ALINHI' PEUT
< AVOIR SONT 'BITX' A '0' SI LA LISTE
< ARGUMENT 'VALESC' AUTORISEE TOUS LES
< GROUPES DE BLOCS...
RBT L,X < ET ON MEMORISE SON TRAITEMENT...
PSR A,B < ET SAUVEGARDE DE LA LISTE COURANTE...
<
< ACTIVATION DU MECANISME, ET
< INHIBITION DU GROUPE DE BLOCS
< ENTRELACES COURANT :
<
LA VAR+ALINHI
SBT BITX
STA VAR+ALINHI < ON POURRA AINSI ACCEDER A LA LISTE PAR
< 'ATMOBT', MAIS DE PLUS, ON ACTIVE LE
< MECANISME DANS 'HDLDKU'...
ADRI -LVALES+B,X
NGR X,A < (A)=NUMERO DU GROUPE COURANT DANS LA
< CONVENTION INVERSEE QUI EST CELLE
< DE 'LINHIB'...
XWOR%1: VAL LLINHI*NBITMO < NOMBRE DE BLOCS DANS 'LINHIB',
XWOR%1: VAL XWOR%1/LVALES < ET DONC NOMBRE DE BLOCS PAR GROUPE
< PUISQUE 'VALESC' NE PEUT CONTENIR QUE
< 'NBITMO' GROUPES...
XWOR%2: VAL XWOR%1=K < POUR FAIRE UNE MULTIPLICATION PAR
< DECALAGE...
IF BIT>XWOR%2-XWOR%1,,XEIF%,
IF ATTENTION : LE NOMBRE DE BLOCS PAR GROUPE
IF DOIT ETRE UNE PUISSANCE DE 2 AFIN QUE CE
IF SUIT SOIT CORRECT !!!
XEIF%: VAL ENDIF
SLRD NBITMO-XWOR%2 < (NE PAS OUBLIER QUE (B)=CLEAR...)
< (B)=NUMERO DU PREMIER BLOC DU GROUPE
< COURANT,
LXI XWOR%1 < (X)=NOMBRE DE BLOCS PAR GROUPE,
LYI FONRB0 < (Y)=FONCTION DE MISE A '0' D'UN BIT AVEC
< VERIFICATION PREALABLE,
LAD VAR+ALINHI < (A)=ADRESSE DU RELAI D'ACCES A LA LISTE
< 'LINHIB'.
PSLOW3: EQU $
XR B,X < (X)=NUMERO DU BLOC COURANT, ET SAVE 'X',
BSR ATMOBT < INHIBITION DU BLOC COURANT (X),
XR B,X < RESTAURE,
ADRI I,B < ET PASSAGE AU BLOC SUIVANT,
JDX PSLOW3 < S'IL EXISTE...
PLR A,B < SINON, RESTAURATION DE LA LISTE COURANTE
< DES GROUPES A INHIBER,
JMP PSLOW2 < ET RECHERCHE DU SUIVANT...
<
< SORTIE :
<
PSLOW4: EQU $
PLR B,X,L
RSR
PAGE
<
<
< P R O T E C T I O N D E ' D K U '
< P A R G R O U P E S D E C Y L I N D R E S :
<
<
< PHILOSOPHIE :
< NE PARLONS QUE DE 'DKU' ; CE
< DISQUE POSSEDE UNE LISTE 'LSDK'
< DONT CHAQUE BIT EST ASSOCIE A UN
< GROUPE DE 'NCYLP' CYLINDRES ;
< LORSQU'UN TEL BIT EST A 1, CELA
< SIGNIFIE QUE LE GROUPE DE CYLINDRES
< ASSOCIE A ETE APPROPRIE PAR UN
< UTILISATEUR (VOIR LA COMMANDE
< "!Q DU DEMANDEUR D'INITIALISATION,
< (LE VOLUME EST DONC PRIVE...)
LRM A,X
WORD CLEVOL
WORD NVOLIM
STA VOLCLE,L < PREMIERE CLEF DE VALIDATION,
STX VOLNIM,L < NOMBRE DE BLOCS INITIALEMENT LIBRES,
LAI LVOLIM
STA VOL23,L < DEUXIEME CLEF DE VALIDATION, ET CONSTANTE
< PERMETTANT DES CONVERSIONS NUMEROS DE
< BLOC <--> ADRESSE DE Q-SECTEURS.
LAD VOLTAB,L
LR A,L < (L)=ADRESSE DE LA TABLE D'ALLOCATION.
LXI MVOLIM < (X)=NOMBRE DE MOTS A INITIALISER.
LAI MMOT < (A)=CONFIGURATION DE CHAQUE MOT CORRES-
< PONDANT A UN ETAT LIBRE INITIAL.
P3SGU1: EQU $
STA O,L < INITIALEMENT, TOUS LES BLOCS SONT LIBRES,
ADRI D,L < PASSAGE AU MOT SUIVANT,
JDX P3SGU1 < S'IL EXISTE...
XWOR%1: VAL LVOLTA-MVOLIM < NOMBRE DE MOTS RESIDUELS DANS LE DESCRIP-
< TEUR DERRIERE LA TABLE D'ALLOCATION.
IF XWOR%1-K,,XEIF%,XEIF%
IF ATTENTION : LA LONGUEUR RESIDUELLE EST NEGATIVE !!!
XEIF%: VAL ENDIF
IF XWOR%1-K,XEIF%,XEIF%,
LXI XWOR%1 < (X)=LONGUEUR DU RESIDU.
P3SGU2: EQU $
STZ O,L < CLEAR DE LA FIN DU DESCRIPTEUR...
ADRI D,L < AU MOT SUIVANT,
JDX P3SGU2 < S'IL EXISTE...
XEIF%: VAL ENDIF
<
< INITIALISATION DU VOLUME PAR
< ECRITURE DE SON DESCRIPTEUR :
<
LR B,A < (A)=ADRESSE DU BUFFER DU DESCRIPTEUR.
PLR B,X,L < RESTAURATIONS :
< (B)='NSP' DU DISQUE,
< (X)=INDEX DE LA GRAMMAIRE 'CCI',
< (L)=ADRESSE DE LA 'DCTSER'.
PSR B,W < ET SAUVEGARDES...
LR A,W < (W)=ADRESSE DU BUFFER DU DESCRIPTEUR, ET
< CECI TEMPORAIREMENT...
LAD VAR+DEMCCI
XR A,W < (W)=ADRESSE DE LA DEMANDE, ET
< (A)=ADRESSE DU BUFFER DU DESCRIPTEUR.
STA ARGDEM+AMDEM < GENERATION DE 'AMDEM'.
SWBR B,A < MISE EN PLACE DU 'NSP' DU DISQUE,
ORI XDSYM?XTYPAD < POSITIONNEMENT DU MODE SYMBOLIQUE, ET
< DE L'ADRESSAGE MOT.
STA NSPTYP < GENERATION DU 'NSPTYP'.
LAI FGW
STA ARGDEM+OPDEM < MISE EN PLACE D'UNE FONCTION D'ECRITURE.
LRM A,B
WORD LVOL*NOCMO < (A)=LONGUEUR DU BUFFER DU DESCRIPTEUR,
WORD SECVOL < (B)=ADRESSE Q-SECTEUR DU DESCRIPTEUR.
STA ARGDEM+CODEM < GENERATION DU 'CODEM',
STB ARGDEM+ASDEM < ET DE 'ASDEM'.
BSR ACHAND < ENVOI DE LA DEMANDE D'ECRITURE,
WAIT WEIO < ET ATTENTE DE FIN...
CPZ ARGDEM+ETADEM < COMMENT CELA S'EST-IL PASSE ???
PLR B,W < RESTAURATIONS :
< (B)='NSP' DU DISQUE, ET
< (W)=ADRESSE DE 'DCTESC'.
<
< TRAITEMENT DES ERREURS A L'INITIALISATION,
< OU LORS DU MONTAGE :
<
P3SGU4: EQU $ < ENTRY POUR LES ERREURS LORS DU MON-
< TAGE (MAUVAIS VOLUME, OU INCOHERENCE
< DE NUMERO DE COMPTE,...).
PSR X,L
LR B,X < (X)='NSP' DU DISQUE..
JE P3SGU3 < OK, TOUT EST BON...
LBI NSPVID < (B)='NSPVID',
IF MONT0-K,,XEIF%,
IF ATTENTION : LE 'STZ' EST MAUVAIS !!!
XEIF%: VAL ENDIF
STZ VALESC-DCTESK,W < ON FORCE UN NUMERO DE VOLUME NUL, INDI-
< QUANT AINSI, QU'IL N'Y A PAS DE VOLUME
< MONTE, ET QUE L'ON DOIT FAIRE SEULEMENT
< LA PREMIERE PARTIE DU MONTAGE...
P3SGU3: EQU $
JMP A2SGU1 < VERS UNE INITIALISATION PARTIELLE
< DU BUFFER DU DESCRIPTEUR (MONTAGE)...
PAGE
<
<
< D E M O N T A G E D ' U N V O L U M E :
<
<
< FONCTION :
< CE MODULE DEMONTE EXPLICITEMENT
< LE VOLUME COURANT (TOUT EN NOTANT
< QUE LA DESASSIGNATION DU 'NVP'
< ASSOCIE PROVOQUE UN DEMONTAGE
< IMPLICITE).
<
<
< ARGUMENTS :
< (B)='NSP' DU DISQUE D'EXTENSION DE VOLUME,
< (L)=ADRESSE DE 'DCTSER',
< (W)=ADRESSE DE 'DCTESC'.
<
<
P5SGU: EQU $
<
< MISE A JOUR DU DESCRIPTEUR DE VOLUME :
< (NOTA : ON N'A PAS A LE REECRIRE
< PUISQUE LE 'SGN' LE REECRIT APRES
< CHAQUE MISE A JOUR)
<
PSR X,L
LR B,X < (X)='NSP' DU DISQUE D'EXTENSION :
BSR ACADCT < (A)=(L)=ADRESSE DE LA 'DCT' DU DISQUE
< D'EXTENSION SUR VOLUME.
LA VAR+ABVOLU
LR A,L < (L)=ADRESSE DU BUFFER DU DESCRIPTEUR
< DE VOLUME :
IF MONT0-K,,XEIF%,
IF ATTENTION : LE 'STZ' EST IDIOT !!!
XEIF%: VAL ENDIF
STZ VOLNUM,L < SUPPRESSION DU NUMERO DE VOLUME,
LAI NSPVID
STA VOLNSP,L < DEMONTAGE...
PLR X,L
<
< DEMONTAGE AU NIVEAU DE 'DCTESC' :
<
LA IDDESC-DCTESC,W
TBT IDESC8 < REVALIDATION DE 'IDESC8'...
JC P5SGU1 < OK, IL Y AVAIT UN VOLUME MONTE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT 'IDESC8' PEUT ETRE
< A 0, ALORS QUE DANS 'P4SGU' ON L'A
< TROUVE A 1 !!!
<
P5SGU1: EQU $
RBT IDESC8 < DEMONTAGE...
STA IDDESC-DCTESC,W
RSR
PAGE
<
<
< E N T R E L A C A G E D E S L E C T U R E S R A P I D E S
< ' D K U ' --> ' M E M T V ' :
<
<
< FONCTION :
< CES 2 MODULES REFERENCES PAR
< LE 'CCI' SUITE AUX COMMANDES
< "!DKU S" ET !DKU F" PERMETTENT
< D'AUTORISER/INHIBER L'ENTRELACAGE
< LORS DE LA FONCTION 'FONTVR' SUR
< LE DISQUE 'DKU'.
<
<
PFAST: EQU $ < COMMANDE "!DKU F" :
PFAST1: EQU PFAST < A CAUSE
PFAST2: EQU PFAST < DE
PFAST3: EQU PFAST < L'ASSEMBLEUR...
LRM A
WORD AMEMTV < (A)=ADRESSE-MOTS DE LA ZONE VISUALISEE.
JMP PVITES < VERS LA MEMORISATION...
PSLOW: EQU $ < COMMANDE "!DKU S" :
LRM A
WORD AMEMTW < (A)=ADRESSE-MOTS DE LA ZONE INTERME-
< DIAIRE D'ENTRELACAGE,
<
< MEMORISATION DE LA COMMANDE :
<
PVITES: EQU $
PSR W
CALL #SISP CMS5 W ZERO#
< (W)=BASE LA MEMOIRE DEBANALISEE,
STA TVENTR-ZERO,W < MEMORISATION DE "!DKU S"/"!DKU F"...
PLR W
RSR < ET C'EST TOUT...
PAGE
<
<
< G E S T I O N D E L A S Y N C H R O N I S A T I O N
< S U R L E S E C T E U R 0 D E ' D K U ' ,
< A I N S I Q U E D E S E S E R R E U R S H A R D S :
<
<
< FONCTION :
< CES 2 MODULES SONT REFERENCES
< PAR LE 'CCI' VIA LES COMMANDES
< "!DK S0 ON" ET "!DK S0 OFF" QUI
< PERMETTENT RESPECTIVEMENT DE
< DEMANDER A 'DKU' DE SE SYNCHRONISER
< SUR LE SECTEUR 0 DE CHAQUE PISTE
< (ET PLUS DE "RETURN TO ZERO TRACK"
< SUR ERREUR HARD), ET LE CONTRAIRE...
<
<
PS0ON: EQU $ < "!DK S0 ON" : SYNCHRONISATION SUR LE
< SECTEUR 0 DE CHAQUE PSITE DE 'DKU', ET
< PLUS DE "RETURN TO ZERO TRACK" SUR
< ERREUR HARD.
BSR ASMMK < M A S Q U A G E I N T E R R U P T S...
LA MEMV
SBT XSYNC0 < ON AUTORISE...
JMP PS0ON1 < VERS LA MISE A JOUR...
PS0OFF: EQU $ < "!DK S0 OFF" : 'DKU' NE DOIT PAS SE
< SYNCHRONISER SUR LE SECTEUR 0 DE
< CHAQUE PISTE, ET FAIRE UN "RETURN TO
< ZERO TRACK" POUR CHAQUE ERREUR HARD.
PS0OF1: EQU PS0OFF < A CAUSE
PS0OF2: EQU PS0OFF < DE
PS0OF3: EQU PS0OFF < L'ASSEMBLEUR...
BSR ASMMK < M A S Q U A G E I N T E R R U P T S...
LA MEMV
RBT XSYNC0 < ON INHIBE...
<
< SORTIE COMMUNE A "ON"/"OFF" :
<
PS0ON1: EQU $
STA MEMV < MISE A JOUR DE 'MEMV',
BSR ASMDK < D E M A S Q U A G E...
RSR
<
<
< L ' U T I L I S A T E U R A - T ' I L ' D K U ' :
<
<
< FONCTION
< LES COMMANDES "!DK..." NE
< SONT AUTORISEES QU'A L'UTILISATEUR
< QUI S'EST ASSIGNE 'DKU', CE QUE VERI-
< FIE LE MODULE SUIVANT...
< CET ACCES UNIQUE EST MIS EN
< PLACE D'UNE PART POUR EVITER DES
< ERREURS DE MANIPULATION DU TYPE
< UN UTILISATEUR 1 EST EN TRAIN
< D'ECRIRE SUR 'DKU' ALORS QU'UN
< DEUXIEME ENVOIE "!DK S0 ON"...
< D'AUTRE PART, AFIN DE GERER
< CORRECTEMENT LES REPRISES SUR
< ERREUR LORS DES 'STN' SUR VOLUME
< AMOVIBLE, IL FAUT QUE LE 'STN'
< ECRIVE SUR LE DISQUE D'EXTENSION
< EN MODE "!DK S" ; AFIN D'EVITER
< QU'UNE COMMANDE "!DK F" SOIT
< EMISE SIMULTANEMENT PAR UN AUTRE
< UTILISATEUR, LA SEULE SOLUTION
< EST DE RESERVER "!DK S/F" A L'UTI-
< LISATEUR QUI FAIT LES ACCES
< SUR VOLUME ET QUI S'EST DONC
< ASSIGNE LE DISQUE...
<
<
< ARGUMENTS :
< (B)='NSPDKU',
< (W)=ADRESSE DE 'DCTESC'.
<
<
PS0AS: EQU $
LYI K < RETOUR OK A PRIORI...
PSR X < SAUVEGARDE DE L'INDEX COURANT DE LA
< GRAMMAIRE DU 'CCI'.
LXI NOCMO*LTASGN-Z < (X)=INDEX DE LA TABLE DES ASSIGNATIONS,
PS0AS1: EQU $
LBY &TASSGN-DCTESC,W
CPR A,B < LE 'NSP' COURANT (A) EST-IL CELUI
< DE 'DKU' (B) ???
JE PS0AS2 < OUI, DONC "!DK S0..." ACCEPTEE...
JDX PS0AS1 < NON, AU 'NSP' SUIVANT S'IL EXISTE...
LYI XCCIER < ET BIEN NON, L'UTILISATEUR N'A PAS
< 'DKU', LA COMMANDE EST REFUSEE...
PS0AS2: EQU $
PLR X < RESTAURATION DE L'INDEX DE LA GRAMMAIRE
< DU 'CCI',
ADR Y,X < ET PREPARATION DU RETOUR...
RSR < ET C'EST TOUT...
PAGE
<
<
< R O U T I N E D ' I T D K M
<
<
< RAPPEL :
< AVEC 'DKM' ET 'DKU', ON
< TRAVAILLE EN CANAL 'HDC' ;
< ON RECUPERE DONC EN FIN DE
< 'SEEK', DE 'RESET' OU D'ECHANGE,
< UNE INTERRUPTION D'EXCEPTION...
< CETTE INTERRUPTION RETOMBE
< PAR LA LECTURE DES MOTS D'ETAT
< 'A' ET 'B' DANS 'ETAT0' ET
< 'ETAT1' DES 'DCT' CORRESPON-
< DANTES POUR UNE EXPLOITATION
< ULTERIEURE PAR LES HANDLERS.
< MALGRE CELA, LE REVEIL DU
< HANDLER N'A LIEU QUE S'IL Y
< A UN ECHANGE EN COURS.
<
< NOTA :
< EN CAS D'INTERRUPTION
< NORMALE, ON PROVOQUE UNE
< 'SYSER'...
<
<
< ARGUMENT :
< (B)=0 : INTERRUPTION NORMALE,
< =1 : INTERRUPTION D'EXCEPTION.
<
<
ITDKM: EQU $
ITDKU: EQU ITDKM
CPZR B < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JNE SYSRBD < D'EXCEPTION, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT UNE
< INTERRUPTION NORMALE A PU
< SE PRODUIRE SUR 'DKM' OU 'DKU' !!!
<
SYSRBD: EQU $
SIO VAR+EADKM < ENTREE DU MOT D'ETAT 'A',
STA ETAT0 < (ETAT0)=MOT D'ETAT 'A'.
SIO VAR+EBDKM < ENTREE DU MOT D'ETAT 'B',
STA ETAT1 < (ETAT1)=MOT D'ETAT 'B'.
BSR ATEC < Y-A-T'IL UN ECHANGE EN COURS ???
JE ITDKM1 < NON, DONC PAS DE REVEIL DU HANDLER...
BSR ARVHDL < OUI, ON REVEILLE DONC LE HANDLER...
ITDKM1: EQU $
RSR < THAT'S ALL FOLK...
PAGE
<
<
< C O N S T A N T E S D I V E R S E S :
<
<
XZDK1:: VAL NEXIST < 'PAS DE WAIT',
XZDK2:: VAL XZDK1+I < 'AVEC WAIT'.
XZDK3:: VAL XZDK1-I < ECRITURE SGF OPTIMISEE OU LECTURE
< SGF NON OPTIMISEE.
XZDK4:: VAL XZDK3-I < ECRITURE SGF SANS OPTIMISATION, OU
< CE N'EST PAS UNE ECRITURE SGF.
< OU C'EST UNE LECTURE NON SGF.
XZDK5:: VAL XZDK3+I < LECTURE SGF OPTIMISEE 1ER TOUR.
XZDK6:: VAL XZDK5+I < LECTURE SGF OPTIMISEE 2EME TOUR.
XLRUR:: VAL K < MODE DE GESTION DES 'LRU' PAR ROTATION :
< ON AMENE PAR DECALAGE CIRCULAIRE L'ENTREE
< COURANTE EN TETE.
XLRUP:: VAL XLRUR+I < MODE DE GESTION DES 'LRU' PAR PERMUTA-
< TION : L'ENTREE COURANTE EST PREMUTEE
< AVEC L'ENTREE PRECEDENTE (SAUF EN TETE,
< BIEN ENTENDU...).
IF XLRUP-XLRUR,XEIF%,,XEIF%
IF ATTENTION : LES TEST DISCRIMINATOIRES
IF SONT IMPOSSIBLES !!!
XEIF%: VAL ENDIF
PAGE
<
<
< S I M U L A T E U R D E M E M O I R E
< V I R T U E L L E S U R D K F :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
DCTDKA: EQU $
PSTDKA: WORD K;K;K;K;COM+DEPCS;DCTDKA;NIL;PILDKA;HANDLR;SMST;SO;SE
#@ASCI " DKA" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XXDCTP < ETALOC=XXDCTP A' NON LOUABLE.
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'DKA'.
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'DKA.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLDKA < ROUTINE SPECIFIQUE.
WORD NIL < PAS DE RIT.
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < FRTRY.
WORD K < HSTATS.
WORD XTESTO < TESTO.
XWOR%1: VAL K
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < LISTE DES FONCTIONS AUTORISEES.
XWOR%1: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARDKA: EQU $
IF VARDKA-DCTDKA-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< SIMULATION DES TRANSFERTS :
<
XBMEMA:: VAL YY7 < LONGUEUR DES PAGES DE LA MEMOIRE
< VIRTUELLE 'DKA'.
WORD XBMEMA
LBMEMA:: VAL $-D-VARDKA < LONGUEUR DES PAGES DE 'DKA'.
WORD MOVEV
AMOVEV:: VAL $-D-VARDKA < SOUS-PROGRAMME COMMUN A 'DKA' ET 'DKB'
< DE SIMULATION DES TRANSFERTS.
WORD CHANDB
ACHANB:: VAL $-D-VARDKA < SOUS-PROGRAMME D'ENVOI D'UNE DEMANDE
< PAR 'CHAND' AVEC FORCAGE DE LA PAGE 0...
<
< DEMANDE A 'DKF' :
<
XWOR%1: VAL MSPTYP=K < POUR CADRER LE 'NSP'...
XWOR%2: VAL NSPDKF>XWOR%1 < INITIALISATION DE NSPTYP.
XWOR%2: VAL COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?PRIO=FMASK(K?XWOR%2=FCINST
WORD XWOR%2 < NSPTYP.
DKADEM:: VAL $-D-VARDKA < DEMANDE AU 'DKF'.
WORD NILK < OPDEM (0=LECTURE, 1=ECRITURE).
WORD NIL < ADRESSE MOT DE LA PAGE REELLE.
WORD XBMEMA*NOCMO < CODEM : ON MANIPULE 1 SECTEUR ENTIER.
WORD NILS < ADRESSE PAGE VIRTUELLE (SECTEUR).
WORD NILK
WORD NILK
WORD NIL
DKADEN:: VAL $-VARDKA < DEMANDE DESTINEE AUX TRANSITS DES
< DEMANDES DONT LE CODEM EST TROP
< GRAND ; AU QUEL CAS ON LES ENVOIE
< DIRECTEMENT A 'DKF'...
DZS LDEM0
<
< DEFINITION DE LA MEMOIRE VIRTUELLE :
<
DKNSO:: VAL ZERBV < 1ERE PAGE VIRTUELLE.
DKNSD:: VAL ZERBNV-Z < DERNIERE PAGE VIRTUELLE.
WORD DKNSO
DKANSO:: VAL $-D-VARDKA < 1ERE PAGE VIRTUELLE.
WORD DKNSD
DKANSD:: VAL $-D-VARDKA < DERNIERE PAGE VIRTUELLE.
<
< DIVERS :
<
WORD XLRUR
DKAMOD:: VAL $-D-VARDKA < MODE DE GESTION DE LA 'LRU' : INITIA-
< LISE POUR UNE GESTION PAR PERMUTATION...
WORD XZDK2
DKAW:: VAL $-D-VARDKA < INDICATEUR DE 'WAIT' PRELIMINAIRE...
< 1 : PAS DE WAIT PRELIMINAIRE,
< 0 : WAIT PRELIMINAIRE.
WORD SPDKA
ASPDKA:: VAL $-D-VARDKA < SOUS-PROGRAMME D'E/S SUR 'DKF'.
WORD NILS
DKAAS:: VAL $-D-VARDKA < TRANSIT D'UN 'ASDEM'.
WORD NILK
DKAOP:: VAL $-D-VARDKA < TRANSIT D'UN 'OPDEM'.
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILDKA: EQU $-DEPILE
XWPILE: VAL LPILEH+20
CALL #SISP CMS5 GENPIL2#
<
<
< P A G E S R E E L L E S :
<
<
DKAPAG:: VAL '26 < NOMBRE DE PAGES REELLES.
PAGES: EQU $
DO DKAPAG
DZS XBMEMA
<
<
< D E F I N I T I O N D E L A ' L R U ' :
<
<
< DEFINITION D'UNE ENTREE :
< MOT0=Q8000 SI L'ENTREE EST INOCCUPEE,
< =ADRESSE PAGE VIRTUELLE (SECTEUR) SI OCCUPEE.
< MOT1=ADRESSE MOT DE LA PAGE REELLE.
<
<
PAVIR:: MOT O < MOT0 D'UNE ENTREE LRU.
PARES:: MOT PAVIR+D < MOT1 D'UNE ENTREE LRU.
XWOR%1: VAL XBMEMA=K < POUR CALCULER DES ADRESSES DE BUFFERS.
IF BIT>XWOR%1-XBMEMA,,XEIF%,
IF ATTENTION : 'XBMEMA' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
DKALRU: EQU $
DO DKAPAG
WORD Q8000;K=FCDO)MFFFF+N+DKAPAG-Z>XWOR%1+PAGES
LARU:: VAL $-DKALRU/DKAPAG < LONGUEUR D'UNE ENTREE.
CALL #SISP CMS5 CHECK#
PAGE
<
<
< S I M U L A T E U R D E M E M O I R E
< V I R T U E L L E S U R D K F :
<
<
< FONCTION :
< CE FAUX DISQUE EST UN SIMULATEUR
< DE MEMOIRE VIRTUELLE; IL ESSAYE DE
< TENIR EN MEMOIRE CENTRALE LES SECTEURS
< DE 'DKF' LES PLUS UTILISES A L'AIDE
< D'UNE LISTE 'LRU'. POUR DES RAISONS
< EVIDENTES DE SECURITE, A CHAQUE FOIS
< QU'UNE ECRITURE EST DEMANDEE, ELLE
< EST FAITE DANS UNE PAGE VIRTUELLE,
< MAIS AUSSI SUR DISQUE (EN PARALLELE).
<
<
USE L,DCT0
USE W,DEM0
HDLDKA: EQU $
LR W,Y < (Y)=SAVE L'ADRESSE DE LA DEMANDE.
<
< VALIDATION DES ARGUMENTS :
<
LA ARGDEM+OPDEM
XWOR%1: VAL FGR?FGW=K < POUR DISCRIMINER LECTURE/ECRITURE...
RBT NBITMO-B-XWOR%1
JAE SYSRBE < OK, OPDEM=K OU 2...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ALLER VOIR LE DEMANDEUR, POUR
< VOIR CE QU'IL VEUT VRAIMENT...
<
SYSRBE: EQU $
LA ARGDEM+CODEM
CP VAR+DKADEM+T+CODEM
JG DKA10 < TROP GRAND, ENVOI DIRECT A 'DKF'.
JAG SYSRBF < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< S'EN ALLER...
<
SYSRBF: EQU $
LA ARGDEM+ASDEM
CP VAR+DKANSO < LE SECTEUR DEMANDE EST-IL DANS
< LA MEMOIRE VIRTUELLE ???
JL DKA1 < NON, ERREUR...
CP VAR+DKANSD < MEME QUESTION...
JLE DKA50 < OUI, OK...
DKA1: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
JMP DKA10 < PUIS ENVOI A 'DKF'...
<
< RECHERCHE DU SECTEUR DEMANDE (A) DANS LA LRU :
<
DKA50: EQU $
LRM X,W
WORD DKAPAG < (X)=NOMBRE D'ENTREES DE LA LRU,
WORD DKALRU-LARU < (W)=ADRESSE PRECEDENTE DE LA LRU.
LR A,B < (B)=SECTEUR DEMANDE (PAGE VIRTUELLE).
DKA2: EQU $
ADRI LARU,W < ACCES A L'ENTREE COURANTE.
LA PAVIR,W < (A)=PAGE VIRTUELLE COURANTE.
CPR A,B < EST-CE LA PAGE DEMANDEE ???
JE DKA3 < OUI, PAGE TROUVEE RESIDENTE.
CP INFINI < EST-ON SUR LA PREMIERE ENTREE LIBRE ???
JE DKA4 < OUI, LA PAGE N'EST PAS TROUVEE,
< MAIS LA LRU N'EST PAS PLEINE.
JDX DKA2 < A L'ENTREE SUIVANTE...
<
< PAGE NON TROUVEE, ET LRU PLEINE :
<
<
< NOTA : LA PAGE SE TROUVANT EN QUEUE DE LA
< 'LRU' PEUT ETRE ECRASEE SANS SOUCIS, EN
< EFFET, OU BIEN ELLE N'A ETE QUE LUE, ET
< DONC SA COPIE DISQUE EST CORRECTE, OU BIEN
< ELLE A ETE ECRITE AU MOINS UNE FOIS, ET TOUTE
< MISE A JOUR DE LA MEMOIRE VIRTUELLE S'ACCOMPA-
< GNE EN PARALLELE D'UNE MISE A JOUR DU DISQUE...
<
<
< PAGE NON TROUVEE, ET LA LRU A AU MOINS UNE ENTREE DISPONIBLE :
<
DKA4: EQU $
STB PAVIR,W < (B)=PAGE DEMANDEE, QUE L'ON MET DANS
< L'ENTREE LIBRE D'ADRESSE (W).
XR W,Y < (W)=ADRESSE DEMANDE ARGUMENT.
LA ARGDEM+OPDEM
XR W,Y
JANE DKA3 < (A)=2 : C'EST UNE ECRITURE DE PAGE.
STB VAR+DKAAS < (A)=0 : C'EST UNE LECTURE, IL FAUT
< DONC AMENER LA PAGE (B) EN MEMOIRE.
STZ VAR+DKAOP < DEMANDE DE LECTURE,
LXI XZDK2 < AVEC WAIT (X=1).
BSR VAR+ASPDKA < LECTURE DE LA PAGE DEMANDEE
< AVEC ATTENTE DE FIN D'E/S.
<
< LA PAGE DEMANDEE EST RESIDENTE :
<
DKA3: EQU $
LA PARES,W < (A)=ADRESSE DE LA PAGE RESIDENTE,
CP VAR+DKADEM+T+AMDEM
JNE DKA40 < CE N'EST PAS LA PAGE QUI FUT CONCER-
< NEE PAR L'ENTREE-SORTIE PRECEDENTE...
CPZ VAR+DKAW < OUI, ALORS Y-A-T'IL LIEU D'ATTENDRE
< LA FIN D'ENTREE-SORTIE ???
JNE DKA40 < NON...
IC VAR+DKAW < OUI, MEMORISONS CETTE ATTENTE,
WAIT VAR+DKADEM+X18 < ET ATTENDONS...
DKA40: EQU $
XR Y,W < (W)=ADRESSE DE LA DEMANDE ARGUMENT.
LA ARGDEM+CODEM < (A)=NOMBRE D'OCTETS DEMANDES,
ADRI NOCMO-E,A < POUR PASSAGE A UN NOMBRE DE
< MOTS AFIN D'ASSURER LA COMPATIBI-
< LITE AVEC 'DKF'...
SLRS NOCMO=K < CONVERSION EN UN NOMBRE DE MOTS.
LR A,X < (X)=NOMBRE DE MOTS.
LA NSPTYP
TBT TYPAD < A-T'ON UNE ADRESSE MOT ???
LA ARGDEM+AMDEM < OUI A PRIORI...
JC DKA6 < ET OUI, (A)=ADRESSE MOT...
SLRS NOCMO=K < NON, CONVERSION...
JNC SYSRBG < OK (ADRESSE PAIRE OCTETS)...
BSR ASYSER < E R R E U R S Y S T E M E ...
SYSRBG: EQU $
DKA6: EQU $
CPZ ARGDEM+OPDEM < LECTURE OU ECRITURE ???
XR Y,W
LB PARES,W < (B)=ADRESSE MOT DE LA PAGE RESIDENTE, ET
< (A)=ADRESSE-MOT DU BUFFER DEMANDE.
JNE DKA7 < 2=ECRITURE : BUFFER --> PAGE.
XR A,B < 0=LECTURE : PAGE --> BUFFER.
DKA7: EQU $
BSR VAR+AMOVEV < SIMULATION DE L'ENTREE/SORTIE...
<
< ROTATION DE LA LRU :
<
LA PAVIR,W < SAVE LE NUMERO DE PAGE VIRTUELLE,
LB PARES,W < ET L'ADRESSE MOT EN RESIDENT.
LR W,X < (X)=ADRESSE COURANTE EN LRU,
LRM W
WORD DKALRU < (W)=ADRESSE DE LA LRU.
CPR X,W < EST-ON DEJA EN TETE ???
JE DKA60 < OUI, RIEN A FAIRE...
< ON A :
< (A)=ADRESSE-DISQUE DE LA PAGE VIRTUELLE.
PSR A,B < NON, SAUVEGARDE DU CONTENU DE L'ENTREE
< COURANTE DE LA 'LRU'.
CPZ VAR+DKAMOD < QUEL EST LE MODE DE GESTION DE LA 'LRU' ?
IF XLRUR-K,,XEIF%,
IF ATTENTION : LE TEST EST INCOHERENT !!!
XEIF%: VAL ENDIF
JE DKA62 < PAR ROTATION (DECALAGE CIRCULAIRE...)...
<
< PAR PERMUTATION (DE L'ENTREE
< COURANTE ET DE L'ENTREE PRE-
< CEDENTE : CETTE METHODE AMENE
< PLUS DOUCEMENT EN TETE LES PAGES
< LES PLUS UTILISEES, MAIS SURTOUT
< NE MET PAS EN TETE LES PAGES RE-
< FERENCEES UNE SEULE FOIS...) :
<
LR X,W < RESTAURE :
< (W)=ADRESSE DE L'ENTREE COURANTE,
ADRI -LARU,W < (W)=ADRESSE DE L'ENTREE PRECEDENTE,
LA PAVIR,W < L'ENTREE
LB PARES,W < PRECEDENTE
STA PAVIR+LARU,W < RECULE
STB PARES+LARU,W < D'UN "CRAN"...
JMP DKA61 < VERS L'AVANCEE DE L'ENTREE COURANTE
< D'UN "CRAN" (A LA PLACE DE L'ENTREE
< PRECEDENTE...).
<
< PAR ROTATION (ON AMENE L'ENTREE
< COURANTE EN TETE PAR DECALAGE
< CIRCULAIRE) :
<
DKA62: EQU $
SBR W,X < (X)=NOMBRE DE MOTS A DEPLACER.
LR W,A < (A)=EMETTEUR (ORIGINE DE LA LRU),
LR W,B
ADRI LARU,B < (B)=RECEPTEUR (LRU+LARU).
MOVE < ROTATION...
DKA61: EQU $
PLR A,B
STA PAVIR,W < GENERATION DE L'ENTREE DE TETE, AVEC
STB PARES,W < LA PAGE VIRTUELLE (A), ET L'ADRESSE
< RESIDENTE (B) DANS LE CAS DE 'XLRUR', OU
< DE L'ENTREE PRECEDENTE DANS LE CAS DE
< 'XLRUP'...
DKA60: EQU $
XR Y,W < (W)=ADRESSE DE LA DEMANDE.
CPZ ARGDEM+OPDEM < LECTURE OU ECRITURE ???
IF FGR-K,,XEIF%,
IF ATTENTION : LE TEST PRECEDENT VA MERDER !!!
XEIF%: VAL ENDIF
XR Y,W
JE DKA8 < 0 : LECTURE, C'EST FINI...
STA VAR+DKAAS < 2 : ECRITURE, ON VA ECRIRE LA PAGE
LAI FGW < VIRTUELLE (A) EN PARALLELE.
STA VAR+DKAOP < ECRITURE...
LXI XZDK1 < (X)=K : PAS DE WAIT...
BSR VAR+ASPDKA < ECRITURE DE LA PAGE VIRTUELLE EN
< PARALLELE PAR MESURE DE SECURITE...
DKA8: EQU $
STZ ETAT0 < RETOUR OK...
LR Y,W < RESTAURE (W)=ADRESSE DE LA DEMANDE...
RSR
<
< ENVOI DIRECT A 'DKF' DES ECHANGES TROP GRANDS :
<
DKA10: EQU $
<
< RECHERCHE PREALABLE EN LRU :
<
LA ARGDEM+CODEM < (A)=NOMBRE D'OCTETS DEMANDES,
AD VAR+DKADEM+T+CODEM
ADRI -NOCMO+E,A < QUE L'ON MAJORE AFIN D'AVOIR UN
SARD NBITMO < NOMBRE ENTIER DE BLOCS.
DV VAR+DKADEM+T+CODEM
LR A,X < (X)=NOMBRE DE BLOCS DE 'QUANTA'
< SECTEURS DEMANDES,
LB ARGDEM+ASDEM < (B)=ADRESSE DU PREMIER BLOC DE
< 'QUANTA' SECTEURS DEMANDES.
DKA80: EQU $
PSR B,X < SAVE L'ADRESSE DU PREMIER
< ET LE NOMBRE...
LRM X,W
WORD DKAPAG < (X)=NOMBRE DE PAGES RESIDENTES.
WORD DKALRU-LARU < (W)=ADRESSE COURANTE AVANT LRU.
DKA42: EQU $
ADRI LARU,W < PASSAGE A L'ENTREE SUIVANTE.
LA PAVIR,W < (A)=PAGE VIRTUELLE COURANTE.
CPR A,B < EST-CE CELLE QUI EST DEMANDEE ???
JE DKA43 < OUI, IL FAUT L'ELIMINER...
CP INFINI < EST-CE LA FIN DE LRU ???
JE DKA44 < OUI, ON N'A PAS TROUVE LA PAGE (B).
JDX DKA42 < A L'ENTREE SUIVANTE.
JMP DKA44 < ON N'A PAS TROUVE LA PAGE (B),
< ET LA LRU EST PLEINE...
<
< ELIMINATION D'UNE PAGE VIRTUELLE PRESENTE EN
< LRU ET CONCERNEE PAR UN ACCES DIRECT A 'DKF' :
<
DKA43: EQU $
LA PARES,W < (A)=SAVE L'ADRESSE-MOT DE LA
ADRI -I,X
CPZR X < EST-CE LA DERNIERE ENTREE LRU ???
JE DKA71 < OUI, RIEN A FAIRE...
ADR X,X < (X)=NOMBRE DE MOTS A DEPLACER.
IF LARU-2,,XEIF%,
IF ATTENTION : LE 'ADR X,X' EST MAUVAIS !!!
XEIF%: VAL ENDIF
DKA70: EQU $
LB LARU,W < ACCES A UN MOT DE LA LRU,
STB O,W < QUE L'ON DECALE DE -LARU MOTS.
ADRI P,W < PASSAGE AU MOT SUIVANT,
JDX DKA70 < S'IL EXISTE...
DKA71: EQU $ < CAS DE LA DERNIERE ENTREE...
STA PARES,W < REGENERATION DE LA DERNIERE ENTREE...
LA INFINI
STA PAVIR,W
DKA44: EQU $
PLR B,X
ADRI I,B < PASSAGE AU BLOC SUIVANT...
JDX DKA80 < ET DECOMPTAGE...
LR Y,W < RESTAURE (W)=ADRESSE DE LA DEMANDE...
<
< ENVOI DIRECT A 'DKF' :
<
LA NSPTYP
ANDI MKTD < CONSERVONS QUELQUES INDICATEURS.
STA VAR+DKADEN+XXNSP < GENERONS LE 'NSPTYP'...
LAI NSPDKF
STBY VAR+DKADEN+XXNSP < INSERTION DU 'NSP' VERS 'DKF'.
LAD VAR+DKADEN+T
LR A,B < (B)=@ZONE RECEPTRICE,
LAD ARGDEM+OPDEM < (A)=@ZONE EMETTRICE,
LXI ASDEM-OPDEM+Z < (X)=NOMBRE DE MOTS ARGUMENTS.
MOVE < GENERATION DE LA DEMANDE DE TRANSIT.
LAD VAR+DKADEN
XR A,W < (A)=SAVE W, ET (W)=@DEMANDE DE TRANSIT.
BSR ACHAND < ENVOI DE LA DEMANDE A 'DKF'.
BSR ACHANW < ATTENTE DE FIN D'OPERATION, ON
< NE PEUT FAIRE AUTREMENT, MEME
< SI LE DEMANDEUR DESIRE FAIRE CETTE
< ENTREE-SORTIE EN PARALLELE !!!
XR A,W < RESTAURATIONS...
JMP DKA8 < ET ON SORT...
PAGE
<
<
< E N T R E E S - S O R T I E S ' D K F ' :
<
<
< ARGUMENTS :
< (W)=ADRESSE COURANTE LRU,
< (X)=0 : ENTREE-SORTIE SANS 'WAIT',
< 1 : E/S AVEC WAIT...
< (VOIR 'XZDK1' ET 'XZDK2')
< (DKAAS)=PAGE VIRTUELLE DEMANDEE,
< (DKAOP)=0 OU 2 (SENS DE L'OPERATION).
<
<
SPDKA: EQU $
PSR B,W
LB PARES,W < (B)=ADRESSE MOT DU BUFFER.
LAD VAR+DKADEM
LR A,W < (W)=ADRESSE DE LA DEMANDE 'DKF'.
CPZ VAR+DKAW < Y-A-T'IL UNE E/S EN COURS ???
JNE SPDKA2 < NON...
BSR ACHANW < OUI, ON ATTEND QU'ELLE SE TERMINE...
SPDKA2: EQU $
STB ARGDEM+AMDEM < ADRESSE MOT DE LA PAGE RESIDENTE.
LA VAR+DKAAS < ADRESSE DE LA PAGE VIRTUELLE.
STA ARGDEM+ASDEM < (SECTEUR).
LA VAR+DKAOP < SENS DE L'OPERATION...
STA ARGDEM+OPDEM
BSR VAR+ACHANB < ENVOI DE LA DEMANDE A 'DKF'...
< (AVEC FORCAGE DE LA PAGE 0, EN EFFET
< CETTE ENTREE-SORTIE SE FAIT DANS L'ESPA-
< CE ABSOLU DU SYSTEME...)
< (EN FORCANT LA PAGE 0...)
CPZR X < FAUT-IL ATTENDRE ???
STX VAR+DKAW < ET ON MEMORISE CE FAIT...
JE SPDKA1 < NON (X=K)...
BSR ACHANW < OUI (X=1)...
SPDKA1: EQU $
PLR B,W
RSR
PAGE
<
<
< E N V O I D ' U N E D E M A N D E P A R ' C H A N D '
< A V E C F O R C A G E D E L A P A G E 0 :
<
<
< FONCTION :
< CE SOUS-PROGRAMME ENVOI
< LA DEMANDE ARGUMENT PAR 'CHAND',
< EN AYANT FORCE (SLO,SLE) AVEC
< LES VALEURS (SO,SE) QUI PERMETTENT
< DE N'ACCEDER QU'A LA PAGE 0...
<
<
< ARGUMENT :
< (W)=ADRESSE DE LA DEMANDE.
<
<
CHANDB: EQU $
PSR A,B
CALL #SISP CMS5 PSRSLO#
< SAUVEGARDE DE (SLO,SLE) D'APPEL,
<
< POSITIONNEMENT SUR LA PAGE 0 :
<
CALL #SISP CMS5 PAGE0#
<
< ENVOI DE LA DEMANDE :
<
BSR ACHAND < EASY ?!???!
<
< RETOUR AU DEMANDEUR :
<
< RESTAURATION DE (SLO,SLE) D'APPEL :
CALL #SISP CMS5 PLRSLO#
PLR A,B
RSR
PAGE
<
<
< S I M U L A T E U R D E M E M O I R E
< V I R T U E L L E S U R ' D K M ' :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
DCTDKB: EQU $
PSTDKB: WORD K;K;K;K;COM+DEPCS;DCTDKB;NIL;PILDKB;HANDLR;SMST;SO;SE
#@ASCI " DKB" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XXDCTP < ETALOC=XXDCTP B' NON LOUABLE.
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'DKB'.
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'DKB.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLDKB < ROUTINE SPECIFIQUE.
WORD NIL < PAS DE RIT.
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < FRTRY.
WORD K < HSTATS.
WORD XTESTO < TESTO.
XWOR%1: VAL K
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FOPURG=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < LISTE DES FONCTIONS AUTORISEES.
XWOR%1: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FOPURG=FMASK(K?XWOR%1=FCINST
WORD XWOR%1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARDKB: EQU $
IF VARDKB-DCTDKB-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< SIMULATION DES TRANSFERTS :
<
XBMEMB:: VAL YY7Q < LONGUEUR DES PAGES DE LA MEMOIRE
< VIRTUELLE 'DKB'.
WORD XBMEMB
LBMEMB:: VAL $-D-VARDKB < LONGUEUR DES PAGES DE 'DKB'.
WORD MOVEV
BMOVEV:: VAL $-D-VARDKB < SOUS-PROGRAMME COMMUN A 'DKB' ET 'DKA'
< DE SIMULATION DES TRANSFERTS.
WORD CHANDB
BCHANB:: VAL $-D-VARDKB < SOUS-PROGRAMME D'ENVOI D'UNE DEMANDE
< PAR 'CHAND' AVEC FORCAGE DE LA PAGE 0...
<
< DEMANDE A 'DKM' :
<
XWOR%1: VAL MSPTYP=K < POUR CADRER UN 'NSP'...
XWOR%2: VAL NSPDKM>XWOR%1 < INITIALISATION DE NSPTYP.
XWOR%2: VAL COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?PRIO=FMASK(K?XWOR%2=FCINST
WORD XWOR%2 < NSPTYP.
DKBDEM:: VAL $-D-VARDKB < DEMANDE AU 'DKM'.
WORD NILK < OPDEM (K=LECTURE, 1=ECRITURE).
WORD NIL < ADRESSE MOT DE LA PAGE REELLE.
WORD XBMEMB*NOCMO < CODEM : ON MANIPULE 1 UNITE ENTIERE.
WORD NILS < ADRESSE PAGE VIRTUELLE (SECTEUR).
WORD NILK
WORD NILK
WORD NIL
DKBDEN:: VAL $-VARDKB < DEMANDE DE TRANSIT DIRECT VERS
< LE 'DKM' LORSQUE LES ENREGISTREMENTS
< SONT TROP LONGS...
DZS LDEM0
<
< DIVERS :
<
WORD XLRUR
DKBMOD:: VAL $-D-VARDKB < MODE DE GESTION DE LA 'LRU' : INITIALISE
< SUR UNE GESTION PAR PERMUTATION DE
< L'ENTREE COURANTE AVEC LA PRECEDENTE...
WORD XZDK2
DKBW:: VAL $-D-VARDKB < INDICATEUR DE 'WAIT' PRELIMINAIRE...
< 1 : PAS DE WAIT PRELIMINAIRE,
< 0 : WAIT PRELIMINAIRE.
WORD SPDKB
ASPDKB:: VAL $-D-VARDKB < SOUS-PROGRAMME D'E/S SUR 'DKM'.
WORD NILS
DKBAS:: VAL $-D-VARDKB < TRANSIT D'UN 'ASDEM'.
WORD NILK
DKBOP:: VAL $-D-VARDKB < TRANSIT D'UN 'OPDEM'.
WORD NILK
DKBSGF:: VAL $-D-VARDKB < INDICATEUR DES CONDITIONS D'OPTI-
< MISATION DES ENTREES-SORTIES :
< -2 : C'EST UNE ECRITURE SGF SANS
< OPTIMISATION, OU
< C'EST UNE ECRITURE NON SGF,
< -1 : C'EST UNE ECRITURE SGF AVEC
< OPTIMISATION (MEMVO=1), OU
< C'EST UNE LECTURE SGF SANS
< OPTIMISATION (MEMVO=K), OU
< C'EST UNE LECTURE NON SGF,
< 0 : C'EST UNE LECTURE SGF AVEC
< OPTIMISATION PREMIER TOUR,
< +1 : C'EST UNE LECTURE SGF AVEC
< OPTIMISATION DEUXIEME TOUR.
< (VOIR 'XZDK3' A 'XZDK6')
WORD NILS
DKBNXT:: VAL $-D-VARDKB < LORS DES LECTURES SGF OPTIMISEES, ON
< TROUVE ICI L'ADRESSE DE LA PAGE
< VIRTUELLE QUE LOGIQUEMENT LE
< SGF DEVRAIT RECLAMER LA PROCHAINE
< FOIS...
<
< ACCES A LA 'LRU' D'UTILISATION DES 'GB' :
<
WORD TLRUGB,X
ALRUGB:: VAL $-D-VARDKB < RELAI D'ACCES A LA 'LRU' QUI MEMORISE
< QUELS SONT LES 'GB' LES PLUS UTILISES
< ET LE PLUS RECEMMENT...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILDKB: EQU $-DEPILE
XWPILE: VAL LPILEH+20
CALL #SISP CMS5 GENPIL2#
<
<
< P A G E S R E E L L E S :
<
<
DKBPAG:: VAL '0A < NOMBRE DE PAGES REELLES.
PBGES: EQU $
DO DKBPAG
DZS XBMEMB
<
<
< D E F I N I T I O N D E L A ' L R U ' :
<
<
< DEFINITION D'UNE ENTREE :
< MOT0=Q8000 SI L'ENTREE EST INOCCUPEE,
< =ADRESSE PAGE VIRTUELLE (SECTEUR) SI OCCUPEE.
< MOT1=ADRESSE MOT DE LA PAGE REELLE.
<
<
PAVIR: MOT PAVIR < MOT0 D'UNE ENTREE LRU.
PARES: MOT PARES < MOT1 D'UNE ENTREE LRU.
DKBLRU: EQU $
DO DKBPAG
WORD Q8000;K=FCDO)MFFFF+N+DKBPAG-Z*XBMEMB+PBGES
LBRU:: VAL $-DKBLRU/DKBPAG < LONGUEUR D'UNE ENTREE.
CALL #SISP CMS5 CHECK#
PAGE
<
<
< S I M U L A T E U R D E M E M O I R E
< V I R T U E L L E S U R ' D K M ' :
<
<
< FONCTION :
< CE FAUX DISQUE EST UN SIMULATEUR
< DE MEMOIRE VIRTUELLE; IL ESSAYE DE
< TENIR EN MEMOIRE CENTRALE LES SECTEURS
< DE 'DKM' LES PLUS UTILISES A L'AIDE
< D'UNE LISTE 'LRU'. POUR DES RAISONS
< EVIDENTES DE SECURITE, A CHAQUE FOIS
< QU'UNE ECRITURE EST DEMANDEE, ELLE
< EST FAITE DANS UNE PAGE VIRTUELLE,
< MAIS AUSSI SUR DISQUE (EN PARALLELE).
<
<
< FONCTIONS RECONNUES :
< '00 : LECTURE,
< '02 : ECRITURE,
< '05 : PURGE ('FOPURG').
<
<
USE L,DCT0
USE W,DEM0
HDLDKB: EQU $
LR W,Y < (Y)=SAVE L'ADRESE DE LA DEMANDE.
<
< VALIDATION DES ARGUMENTS :
<
LA ARGDEM+OPDEM
TBT XBITQ < DEMANDE-T'ON QUANTA=1 ???
JC DKB10X < OUI, DONC ON ENVOIE DIRECTEMENT
< CETTE DEMANDE A 'DKM'...
CPI FOPURG < EST-CE UNE PURGE ???
JE DKB20Y < OUI, ON Y VA...
LBI XZDK3 < -1 : LECTURE A PRIORI...
XWOR%1: VAL FGR?FGW=K < POUR DISCRIMINER LECTURE/ECRITURE...
TBT NBITMO-B-XWOR%1 < EST-CE UNE LECTURE (K) OU ECRITURE (1) ??
SBCR B < -2 : C'EST UNE ECRITURE.
STB VAR+DKBSGF < SAUVEGARDE DE L'INDICATEUR ; ON NOTERA
< QUE POUR UNE E/S NON SGF, ON A :
< DKBSGF<0 !!!
RBT NBITMO-B-XWOR%1
JAE SYSRBH < OK, OPDEM=K OU 2...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ALLER VOIR LE DEMANDEUR, POUR VOIR
< CE QU'IL VEUT VRAIMENT...
<
SYSRBH: EQU $
<
< GESTION DE LA 'LRU' DES 'GB' :
<
LA ARGDEM+ASDEM < (A)=PREMIER Q-SECTEUR DEMANDE,
XWOR%1: VAL DKMINX=K
XWOR%1: VAL -XWOR%1
SLRD -XWOR%1
CPI DKMINX>XWOR%1 < EST-CE UN SECTEUR INEXISTANT ???
JE DKB3A3 < OUI, IL S'AGIT D'UN FAUX SECTEUR UTILISE
< POUR LE COMPACTAGE DES VALEURS 'SGN' ;
< IL EST DONC IGNORE AU NIVEAU 'LRU'...
XWOR%2: VAL NBITMO+DECON+XWOR%1
SLRD XWOR%2 < (B)=NUMERO DU 'GB'-1 D'APPARTENANCE
< DU PREMIER Q-SECTEUR DE L'ECHANGE.
LXI K < (X)=INDEX DE LA 'LRU' QUE L'ON VA PAR-
< COURIR EN PARTANT DES PLUS UTILISES,
< AFIN DE MINIMISER SON TEMPS D'EXPLO-
< RATION...
DKB3A2: EQU $
LBY &VAR+ALRUGB < (A)=NUMERO DE 'GB'-1 COURANT,
CPR A,B < EST-CELUI DE L'ECHANGE COURANT ???
JE DKB3A1 < ET OUI...
ADRI I,X < PASSAGE A L'ENTREE SUIVANTE,
LR X,A
CPI NBGB-Z < SI ELLE EXISTE...
JLE DKB3A2 < ET OUI, ON VA Y ACCEDER...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT LE NUMERO
< DE 'GB'-1 ARGUMENT PEUT NE PAS
< FIGURER DANS LA 'LRU' ???
<
JMP DKB3A3 < ET ON SAUTE LA MISE A JOUR DE LA 'LRU' !!
DKB3A1: EQU $
CPZR X < ON A TROUVE LE 'GB'-1 ARGUMENT (B) DANS
< L'ENTREE (X) DE LA 'LRU' ; CETTE ENTREE
< SERAIT-ELLE PAR HASARD CELLE DE TETE ???
JE DKB3A3 < ET OUI, DONC RIEN A FAIRE...
ADRI -I,X < ET NON, IL FAUT DONC PERMUTER L'ENTREE
< COURANTE AVEC L'ENTREE PRECEDENTE, AFIN
< DE LA FAIRE REMONTER PROGRESSIVEMENT
< EN TETE...
LBY &VAR+ALRUGB < (A)=PREDECESSEUR,
XR A,B < (A)=ENTREE COURANTE, ET
< (B)=PREDECESSEUR,
STBY &VAR+ALRUGB < L'ENTREE COURANTE REMONTE D'UN CRAN,
XR A,B
ADRI I,X
STBY &VAR+ALRUGB < ET L'EX-PREDECESSEUR REDESCEND D'UN...
DKB3A3: EQU $
<
< TEST DES CONDITIONS DE REFERENCE DE 'DKB' :
<
LA ARGDEM+ETADEM < (A)=IDENTITE DU DEMANDEUR.
LB MEMV
TBT MEMVN+NBITMO < LE 'SGN' A-T'IL ACCES A 'DKB' ???
JC DKB30 < OUI, IL Y A DROIT...
IF NSPTRI+I-NSPSG0,,XEIF%,
IF ATTENTION : IL VA Y AVOIR DES MERDES !!!
XEIF%: VAL ENDIF
CPI NSPTRI
JL DKB30 < NON...
CPI NSPSGN
JLE DKB10X < OUI, LE 'SGN' EST DEMANDEUR, ALORS
< QU'IL N'A PLUS ACCES A 'DKB' ; CELA
< PEUT SE PRODUIRE LORSQUE DES DEMANDES
< DU SGN ARRIVE SUR 'DKB', ALORS QU'UNE
< PURGE EST EN COURS DE TRAITEMENT...
< DANS CES CONDITIONS, ON ENVOIE EN
< TRANSPARENCE LA DEMANDE...
DKB30: EQU $
CPI NSPFIL < EST-CE LE SGF ???
JL DKB31 < NON, CONTINUONS...
CPI NSPFIL+NDCTF-Z < EST-CE LE SGF ???
JG DKB31 < NON, CONTINUONS...
TBT MEMVF+NBITMO < OUI, A-T'IL ACCES A 'DKB' ???
JNC DKB10X < NON, ALORS ENVOI TRANSPARENT A 'DKM'.
LR A,X < OUI, (X)=NSP(DCTF),
PSR Y
LYI FONTB < (Y)=FONCTION DE 'TEST BIT'.
LAD ATNSPF
BSR ATMOBT < TEST DU BIT (NSPF).
PLR Y
JNC DKB10X < CETTE 'DCTF' N'A PAS ACCES A LA
< MEMOIRE VIRTUELLE (BIT(NSPF)=K).
LA VAR+DKBSGF < DANS LE CAS DU SGF :
TBT MEMVO+NBITMO < DOIT-ON OPTIMISER LES LECTURES ???
ADCR A < -2 ==> -2 : ECRITURE SANS OPTIMISATION,
< -2 ==> -1 : ECRITURE AVEC OPTIMISATION,
< -1 ==> -1 : LECTURE SANS OPTIMISATION,
< -1 ==> 0 : LECTURE AVEC OPTIMISATION.
STA VAR+DKBSGF < SAUVEGARDE DE L'INDICATEUR ; ON NOTERA
< QUE POUR LES E/S SGF :
< DKBSGF=K : S'IL S'AGIT D'UNE LECTURE,
< ET QUE L'OPTIMISATION EST
< ACTIVE (MEMVO=1),
< DKBSGF<0 : DANS LES AUTRES CAS SGF.
DKB31: EQU $
LA ARGDEM+CODEM
CP VAR+DKBDEM+T+CODEM
JG DKB10X < TROP GRAND, ON ENVOIE DIRECTEMENT...
JAG SYSRBI < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< S'EN ALLER...
<
SYSRBI: EQU $
LA ARGDEM+ASDEM
CP INFINI
JNE SYSRBJ < OK, Q8000 EST INTERDIT...
BSR ASYSER < E R R E U R S Y S T E M E ...
< OU PAS, EN EFFET, VOIR LES PROGRAMMES
< DE COPIE DE DISQUES...
JMP DKB10X < 'INFINI' ETANT UN INDICATEUR DE
< LIBERTE DE LA 'LRU', LES DEMANDES
< PORTANT SUR 'INFINI' VONT DIRECTEMENT
< A 'DKM'...
DKB20Y: JMP DKB20X < RELAI...
SYSRBJ: EQU $
XWOR%1: VAL DKMINX=K
XWOR%1: VAL -XWOR%1
SLRS -XWOR%1
CPI DKMINX>XWOR%1 < EST-CE UN SECTEUR INEXISTANT ???
JE DKB10X < OUI, ENVOI DIRECT A 'DKM'...
LA ARGDEM+ASDEM < NON, RESTAURE 'A'...
<
< RECHERCHE DU SECTEUR DEMANDE (A) DANS LA LRU :
<
DKB91: EQU $ < POINT D'ENTREE DU DEUXIEME TOUR DES
< LECTURES SGF OPTIMISEES.
LRM X,W
WORD DKBPAG < (X)=NOMBRE D'ENTREES DE LA LRU,
WORD DKBLRU-LBRU < (W)=ADRESSE PRECEDENTE DE LA LRU.
LR A,B < (B)=SECTEUR DEMANDE (PAGE VIRTUELLE).
DKB2: EQU $
ADRI LBRU,W < ACCES A L'ENTREE COURANTE.
LA PAVIR,W < (A)=PAGE VIRTUELLE COURANTE.
CPR A,B < EST-CE LA PAGE DEMANDEE ???
JE DKB3 < OUI, PAGE TROUVEE RESIDENTE.
CP INFINI < EST-ON SUR LA PREMIERE ENTREE LIBRE ???
JE DKB4 < OUI, LA PAGE N'EST PAS TROUVEE,
< MAIS LA LRU N'EST PAS PLEINE.
JDX DKB2 < A L'ENTREE SUIVANTE...
<
< PAGE NON TROUVEE, ET LRU PLEINE :
<
<
< NOTA : LA PAGE SE TROUVANT EN QUEUE DE LA
< 'LRU' PEUT ETRE ECRASEE SANS SOUCIS, EN
< EFFET, OU BIEN ELLE N'A ETE QUE LUE, ET
< DONC SA COPIE DISQUE EST CORRECTE, OU BIEN
< ELLE A ETE ECRITE AU MOINS UNE FOIS, ET TOUTE
< MISE A JOUR DE LA MEMOIRE VIRTUELLE S'ACCOMPA-
< GNE EN PARALLELE D'UNE MISE A JOUR DU DISQUE...
<
JMP DKB4 < ON CONSIDERE QUE LA DERNIERE ENTREE
< OCCUPEE EST LIBERABLE...
DKB10X: JMP DKB10 < RELAI...
<
< PAGE NON TROUVEE, ET LA LRU A AU MOINS UNE ENTREE DISPONIBLE :
<
DKB4: EQU $
STB PAVIR,W < (B)=PAGE DEMANDEE, QUE L'ON MET DANS
< L'ENTREE LIBRE D'ADRESSE (W).
XR W,Y < (W)=ADRESSE DEMANDE ARGUMENT.
LA ARGDEM+OPDEM
XR W,Y
JANE DKB3 < (A)=2 : C'EST UNE ECRITURE DE PAGE.
STB VAR+DKBAS < (A)=K : C'EST UNE LECTURE, IL FAUT
< DONC AMENER LA PAGE (B) EN MEMOIRE.
STZ VAR+DKBOP < DEMANDE DE LECTURE,
LXI XZDK2 < AVEC WAIT (X=1).
CPZ VAR+DKBSGF < QUEL EST LE LE MODE EN REALITE ???
JLE DKB92 < PAS D'OPTIMISATION, OU BIEN IL S'AGIT
< DU PREMIER TOUR SGF OPTIMISE...
LXI XZDK1 < DKBSGF>0 : IL S'AGIT DU DEUXIEME TOUR
< SGF DE LECTURE OPTIMISEE ; DANS CES
< CONDITIONS, LA LECTURE DE LA PAGE EST
< EN FAIT UN PRE-CHARGEMENT, ON LA FAIT
< DONC SANS WAIT (X=K).
DKB92: EQU $
BSR VAR+ASPDKB < LECTURE DE LA PAGE DEMANDEE
< AVEC ATTENTE DE FIN D'E/S.
<
< LA PAGE DEMANDEE EST RESIDENTE :
<
DKB3: EQU $
CPZ VAR+DKBSGF < QUEL EST LE MODE ACTUEL ???
JG DKB93 < IL S'AGIT DU DEUXIEME TOUR DU SGF EN
< MODE LECTURE OPTIMISEE ; ON VA DONC
< UNIQUEMENT FAIRE TOURNER LA LRU, AFIN
< DE NE PAS RISQUER DE PERDRE LE BENE-
< FICE DU PRE-CHARGEMENT AU CAS OU CETTE
< PAGE SERAIT EN QUEUE...
LA PARES,W < (A)=ADRESSE DE LA PAGE RESIDENTE.
CP VAR+DKBDEM+T+AMDEM
JNE DKB40 < LA PAGE COURANTE N'EST PAS CELLE QUI
< FUT CONCERNEE PAR LA DERNIERE ENTREE-
< SORTIE, CONTINUONS...
CPZ VAR+DKBW < OUI, Y-A-T'IL LIEU D'ATTENDRE
< LA FIN D'ENTREE-SORTIE ???
JNE DKB40 < NON, CONTINUONS...
IC VAR+DKBW < OUI, MISE A JOUR DES INDICATEURS,
WAIT VAR+DKBDEM+X18 < ATTENTE DE FIN...
DKB40: EQU $
XR Y,W < (W)=ADRESSE DE LA DEMANDE ARGUMENT.
LA ARGDEM+CODEM < (A)=NOMBRE D'OCTETS DEMANDES,
ADRI NOCMO-E,A < AFIN D'OBTENIR UN NOMBRE ENTIER
< DE MOTS POUR ASSURER LA COMPA-
< TIBILITE AVEC 'DKM'.
SLRS NOCMO=K < CONVERSION EN UN NOMBRE DE MOTS.
LR A,X < (X)=NOMBRE DE MOTS.
LA NSPTYP
TBT TYPAD < A-T'ON UNE ADRESSE MOT ???
LA ARGDEM+AMDEM < OUI A PRIORI...
JC DKB6 < ET OUI, (A)=ADRESSE MOT...
SLRS NOCMO=K < NON, CONVERSION...
JNC SYSRBK < OK (ADRESSE PAIRE OCTETS)...
BSR ASYSER < E R R E U R S Y S T E M E ...
SYSRBK: EQU $
DKB6: EQU $
CPZ ARGDEM+OPDEM < LECTURE OU ECRITURE ???
XR Y,W
LB PARES,W < (B)=ADRESSE MOT DE LA PAGE RESIDENTE, ET
< (A)=ADRESSE-MOT DU BUFFER DEMANDE.
JNE DKB7 < 2=ECRITURE : BUFFER --> PAGE.
XR A,B < 0=LECTURE : PAGE --> BUFFER.
CPZ VAR+DKBSGF < QUEL EST LE MODE ACTUEL ???
JNE DKB7 < CE N'EST PAS UN PREMIER TOUR DU SGF
< EN MODE LECTURE OPTIMISEE...
PSR A,W < C'EST LE PREMIER TOUR D'UNE LECTURE
< SGF EN MODE OPTIMISEE :
LR A,W < (W)=ADRESSE DE LA PAGE RESIDENTE,
LA XCHSGF,W < (A)=PREMIER MOT DE LA PAGE RESIDENTE
STA VAR+DKBNXT < C'EST, SI ELLE EXISTE, L'ADRESSE DE
< LA PAGE VIRTUELLE SUIVANTE DANS CE
< FICHIER...
PLR A,W
DKB7: EQU $
BSR VAR+BMOVEV < SIMULATION DE L'ENTREE/SORTIE...
<
< ROTATION DE LA LRU :
<
DKB93: EQU $
LA PAVIR,W < SAVE LE NUMERO DE PAGE VIRTUELLE,
LB PARES,W < ET L'ADRESSE MOT EN RESIDENT.
LR W,X < (X)=ADRESSE COURANTE EN LRU,
LRM W
WORD DKBLRU < (W)=ADRESSE DE LA LRU.
CPR X,W < EST-ON DEJA EN TETE ???
JE DKB60 < OUI, RIEN A FAIRE...
< ON A :
< (A)=ADRESSE-DISQUE DE LA PAGE VIRTUELLE.
PSR A,B < NON, SAUVEGARDE DU CONTENU DE L'ENTREE
< COURANTE DE LA 'LRU'.
CPZ VAR+DKBMOD < QUEL EST LE MODE DE GESTION DE LA 'LRU' ?
IF XLRUR-K,,XEIF%,
IF ATTENTION : LE TEST EST INCOHERENT !!!
XEIF%: VAL ENDIF
JE DKB62 < PAR ROTATION (DECALAGE CIRCULAIRE...)...
<
< PAR PERMUTATION (DE L'ENTREE
< COURANTE ET DE L'ENTREE PRE-
< DENTE : CETTE METHODE AMENE
< PLUS DOUCEMENT EN TETE LES PAGES
< LES PLUS UTILISEES, MAIS SURTOUT
< NE MET PAS EN TETE LES PAGES RE-
< FERENCEES UNE SEULE FOIS...) :
<
LR X,W < RESTAURE :
< (W)=ADRESSE DE L'ENTREE COURANTE,
ADRI -LBRU,W < (W)=ADRESSE DE L'ENTREE PRECEDENTE,
LA PAVIR,W < L'ENTREE
LB PARES,W < PRECEDENTE
STA PAVIR+LBRU,W < RECULE
STB PARES+LBRU,W < D'UN "CRAN"...
JMP DKB61 < VERS L'AVANCEE DE L'ENTREE COURANTE
< D'UN "CRAN" (A LA PLACE DE L'ENTREE
< PRECEDENTE...).
<
< PAR ROTATION (ON AMENE L'ENTREE
< COURANTE EN TETE PAR DECALAGE
< CIRCULAIRE) :
<
DKB62: EQU $
SBR W,X < (X)=NOMBRE DE MOTS A DEPLACER.
LR W,A < (A)=EMETTEUR (ORIGINE DE LA LRU),
LR W,B
ADRI LBRU,B < (B)=RECEPTEUR (LRU+LBRU).
MOVE < ROTATION...
DKB61: EQU $
PLR A,B
STA PAVIR,W < GENERATION DE L'ENTREE DE TETE, AVEC
STB PARES,W < LA PAGE VIRTUELLE (A), ET L'ADRESSE
< RESIDENTE (B) DANS LE CAS DE LA ROTATION
< 'XLRUR', OU DE L'ENTREE PRECEDENTE DANS
< LE CAS DE LA PERMUTATION 'XLRUP'.
DKB60: EQU $
XR Y,W < (W)=ADRESSE DE LA DEMANDE.
CPZ ARGDEM+OPDEM < LECTURE OU ECRITURE ???
IF FGR-K,,XEIF%,
IF ATTENTION : LE TEST PRECEDENT VA MERDER !!!
XEIF%: VAL ENDIF
XR Y,W
JE DKB90 < 0 : LECTURE, ALLONS VOIR S'IL Y A
< UNE OPTIMISATION A FAIRE...
STA VAR+DKBAS < 2 : ECRITURE, ON VA ECRIRE LA PAGE
LAI FGW < VIRTUELLE (A) EN PARALLELE.
STA VAR+DKBOP < ECRITURE...
LXI XZDK1 < (X)=0 : PAS DE WAIT...
BSR VAR+ASPDKB < ECRITURE DE LA PAGE VIRTUELLE EN
< PARALLELE PAR MESURE DE SECURITE...
DKB8: EQU $
STZ ETAT0 < RETOUR OK...
LR Y,W < RESTAURE (W)=ADRESSE DE LA DEMANDE...
RSR
DKB20X: JMP DKB20 < RELI...
DKB91X: JMP DKB91 < RELAI...
<
< ENVOI DIRECT A 'DKM' DES ENREGISTREMENTS TROP LONGS :
<
DKB10: EQU $
<
< RECHERCHE PREALABLE EN LRU :
<
LA ARGDEM+CODEM < (A)=NOMBRE D'OCTETS DEMANDES,
AD VAR+DKBDEM+T+CODEM
ADRI -NOCMO+E,A < QUE L'ON MAJORE AFIN D'AVOIR UN
SARD NBITMO < NOMBRE ENTIER DE BLOCS.
DV VAR+DKBDEM+T+CODEM
LR A,X < (X)=NOMBRE DE BLOCS DE 'QUANTA'
< SECTEURS DEMANDES,
LB ARGDEM+ASDEM < (B)=ADRESSE DU PREMIER BLOC DE
< 'QUANTA' SECTEURS DEMANDES.
DKB80: EQU $
PSR B,X < SAVE L'ADRESSE DU PREMIER
< ET LE NOMBRE...
LRM X,W
WORD DKBPAG < (X)=NOMBRE DE PAFGES RESIDENTES.
WORD DKBLRU-LBRU < (W)=ADRESSE COURANTE AVANT LRU.
DKB42: EQU $
ADRI LBRU,W < PASSAGE A L'ENTREE SUIVANTE.
LA PAVIR,W < (A)=PAGE VIRTUELLE COURANTE.
CPR A,B < EST-CE CELLE QUI EST DEMANDEE ???
JE DKB43 < OUI, IL FAUT L'ELIMINER...
CP INFINI < EST-CE LA FIN DE LRU ???
JE DKB44 < OUI, ON N'A PAS TROUVE LA PAGE (B).
JDX DKB42 < A L'ENTREE SUIVANTE.
JMP DKB44 < ON N'A PAS TROUVE LA PAGE (B),
< ET LA LRU EST PLEINE...
<
< ELIMINATION D'UNE PAGE VIRTUELLE PRESENTE EN
< LRU ET CONCERNEE PAR UN ACCES DIRECT A 'DKM' :
<
DKB43: EQU $
LA PARES,W < (A)=SAVE L'ADRESSE-MOT DE LA
ADRI -I,X
CPZR X < EST-CE LA DERNIERE ENTREE LRU ???
JE DKB71 < OUI, RIEN A FAIRE...
ADR X,X < (X)=NOMBRE DE MOTS A DEPLACER.
IF LBRU-2,,XEIF%,
IF ATTENTION : LE 'ADR X,X' EST MAUVAIS !!!
XEIF%: VAL ENDIF
DKB70: EQU $
LB LBRU,W < ACCES A UN MOT DE LA LRU,
STB O,W < QUE L'ON DECALE DE -LBRU MOTS.
ADRI P,W < PASSAGE AU MOT SUIVANT,
JDX DKB70 < S'IL EXISTE...
DKB71: EQU $ < CAS DE LA DERNIERE ENTREE...
STA PARES,W < REGENERATION DE LA DERNIERE ENTREE...
LA INFINI
STA PAVIR,W
DKB44: EQU $
PLR B,X
ADRI I,B < PASSAGE AU BLOC SUIVANT...
JDX DKB80 < ET DECOMPTAGE...
LR Y,W < RESTAURE (W)=ADRESSE DE LA DEMANDE...
<
< ENVOI DIRECT A 'DKM' :
<
LA NSPTYP
ANDI MKTD < ON NE CONSERVE QUE QUELQUES INDICATEURS.
STA VAR+DKBDEN+XXNSP < GENERATION DU 'NSPTYP'...
LAI NSPDKM
STBY VAR+DKBDEN+XXNSP < INSERTION DU 'NSP' DE 'DKM'.
LAD VAR+DKBDEN+T
LR A,B < (B)=@ZONE RECEPTRICE,
LAD ARGDEM+OPDEM < (A)=@ZONE EMETTRICE,
LXI ASDEM-OPDEM+Z < (X)=NOMBRE DE MOTS ARGUMENTS.
MOVE < GENERATION DE LA DEMANDE DE TRANSIT.
LAD VAR+DKBDEN
XR A,W < (A)=SAVE W, ET (W)=@DEMANDE TRANSIT.
BSR ACHAND < ENVOI DIRECT A 'DKM'...
BSR ACHANW < ATTENTE DE FIN D'OPERATION,
< MEME SI CE N'EST PAS LE DESIR DU
< DEMANDEUR !!!
XR A,W < RESTAURATIONS...
JMP DKB8 < ET ON SORT...
<
< FIN DES LECTURES ; CHOIX DES OPTIMISATIONS :
<
DKB90: EQU $
CPZ VAR+DKBSGF < TEST DU MODE ACTUEL ???
JNE DKB8 < OU BIEN IL N'Y A PAS D'OPTIMISATION A
< FAIRE (<0), OU BIEN ELLE EST FAITE (>0).
IC VAR+DKBSGF < ET OUI, IL S'AGIT DU PREMIER TOUR D'UNE
< LECTURE SGF OPTIMISEE, DKBSGF>0...
LA VAR+DKBNXT < (A)=ADRESSE DE LA PROCHAINE PAGE VIRTUELL
CP INFINI < EXISTE-T'ELLE ???
JE DKB8 < NON, DONC ON SORT...
JMP DKB91X < OUI, ON VA DONC LANCER SON PRE-
< CHARGEMENT...
PAGE
<
<
< P U R G E D E ' D K B ' :
<
<
< NOTA IMPORTANT :
< CETTE OPERATION A POUR BUT DE
< RENVOYER EN VIRTUEL TOUTES LES
< PAGES RESIDENTES ; ELLE EST A
< A FAIRE A CHAQUE FOIS QUE LES
< INDICATEURS DE 'MEMV' CHANGENT...
< ELLE EST TRES SIMPLE, CAR EN
< EN EFFET CHAQUE ACCES EN ECRITURE
< A 'DKB' S'ACCOMPAGNE D'UNE MISE
< MISE A JOUR EN PARALLELE DE 'DKM'...
<
<
DKB20: EQU $
LRM X,W
WORD DKBPAG < (X)=NOMBRE DE PAGES RESIDENTES,
WORD DKBLRU < (W)=ADRESSE DE LA 1ERE ENTREE DE LRU.
LA INFINI < (A)=INDICATEUR DE PAGE LIBRE.
DKB21: EQU $
STA PAVIR,W < L'ENTREE COURANTE EST RENDUE LIBRE...
ADRI LBRU,W < A L'ENTREE
JDX DKB21 < SUIVANTE DE LRU...
JMP DKB8 < ET C'EST TOUT...
PAGE
<
<
< E N T R E E S - S O R T I E S ' D K M ' :
<
<
< ARGUMENTS :
< (W)=ADRESSE COURANTE LRU,
< (X)=0 : E/S SANS WAIT,
< 1 : E/S AVEC WAIT...
< (DKBAS)=PAGE VIRTUELLE DEMANDEE,
< (DKBOP)=0 OU 2 (SENS DE L'OPERATION).
<
<
SPDKB: EQU $
PSR B,W
LB PARES,W < (B)=ADRESSE MOT DU BUFFER.
LAD VAR+DKBDEM
LR A,W < (W)=ADRESSE DE LA DEMANDE 'DKM'.
CPZ VAR+DKBW < Y-A-T'IL UNE E/S EN COURS ???
JNE SPDKB2 < NON...
BSR ACHANW < OUI, ON ATTEND QU'ELLE SE TERMINE...
SPDKB2: EQU $
STB ARGDEM+AMDEM < ADRESSE MOT DE LA PAGE RESIDENTE.
LA VAR+DKBAS < ADRESSE DE LA PAGE VIRTUELLE.
STA ARGDEM+ASDEM < (SECTEUR).
LA VAR+DKBOP < SENS DE L'OPERATION...
STA ARGDEM+OPDEM
BSR VAR+BCHANB < ENVOI DE LA DEMANDE A 'DKM'...
< (AVEC FORCAGE DE LA PAGE 0, EN EFFET
< CETTE ENTREE-SORTIE SE FAIT DANS
< L'ESPACE ABSOLU DU SYSTEME...)
CPZR X < FAUT-IL ATTENDRE ???
STX VAR+DKBW < ET ON MEMORISE CE FAIT...
JE SPDKB1 < NON (X=K)...
BSR ACHANW < OUI (X=1)...
SPDKB1: EQU $
PLR B,W
RSR
PAGE
<
<
< S I M U L A T I O N D E S T R A N S F E R T S
< D E ' D K A ' E T D E ' D K B ' :
<
<
< FONCTION :
< CE SOUS-PROGRAMME COMMUN A 'DKA'
< ET 'DKB' REALISE LES TRANSFERTS ENTRE
< BUFFERS DEMANDEURS ET PAGES RESIDENTES ;
< IL COMPLETE LES PAGES RESIDENTES PAR
< DES '0000 LORSQUE LA LONGUEUR DEMANDEE
< NE CORRESPOND PAS A UNE PAGE COMPLETE,
< LORS D'UNE ECRITURE...
<
<
< ARGUMENT :
< (A)=ADRESSE DE L'EMETTEUR (ABSOLUE OU RELATIVE),
< (B)=ADRESSE DU RECEPTEUR (RELATIVE OU ABSOLUE).
< (X)=NOMBRE DE MOTS A TRANSFERER.
< (Y)=ADRESSE DE LA DEMANDE COURANTE.
<
<
< ATTENTION :
< DETRUIT A, B, X !!!
<
<
MOVEV: EQU $
IF LBMEMB-LBMEMA,,XEIF%,
IF ATTENTION : 'DCTDKA' ET 'DCTDKB' DOIVENT
IF LOCALISER IDENTIQUEMENT 'LBMEMV' !!!
XEIF%: VAL ENDIF
LBMEMV:: VAL LBMEMB?LBMEMA < ACCES A LA LONGUEUR DES PAGES RESIDENTES
< DE LA MEMOIRE VIRTUELLE DEMANDEUSE.
PSR X
XR Y,W
CPZ ARGDEM+OPDEM < EST-CE UNE LECTURE OU UNE ECRITURE ???
XR Y,W
IF FGR-K,,XEIF%,
IF ATTENTION : CE QUI PRECEDE EST COMPLETEMENT IDIOT,
IF ET EN PLUS CELA DOIT SE PRODUIRE AILLEURS !!!
XEIF%: VAL ENDIF
JE MOVEV3 < C'EST UNE LECTURE : IL NE FAUT DONC
< SURTOUT PAS CLEARER LA PAGE COURANTE
< AU CAS OU ON EN LIRAIT PLUTARD UNE
< LONGUEUR SUPERIEURE (LE COMPLEMENT
< SERAIT NUL...).
<
< CAS D'UNE ECRITURE :
<
MVTM < IL S'AGIT D'UN MOUVEMENT DE L'ESPACE
< RELATIF DE L'UTILISATEUR ('SLO' ET 'SLE'
< SONT CORRECTS) VERS L'ESPACE ABSOLU DU
< SYSTEME...
PLR X < RESTAURE : (X)=NOMBRE DE MOTS TRANSFERES.
LR X,A
CP VAR+LBMEMV < A-T'ON TRANSFERE UNE PAGE ENTIERE ???
JE MOVEV1 < OUI, C'EST FINI...
<
< NON, IL FAUT CLEARER LA FIN DE
< LA PAGE RESIDENTE, C'EST BEAUCOUP
< PLUS ESTHETIQUE... MAIS UNIQUEMENT
< LORS D'UNE ECRITURE...
<
PSR W < SAUVEGARDE DE LA LRU COURANTE...
LB PARES,W < (B)=ADRESSE MOT DE LA PAGE RESIDENTE,
ADR X,B
LR B,W < (W)=ADRESSE DU PREMIER MOT NON ECHANGE
< DANS LA PAGE RESIDENTE...
SB VAR+LBMEMV
NGR A,X < (X)=NOMBRE DE MOTS A NETTOYER...
MOVEV2: EQU $
STZ O,W < ET ON NETTOIE...
ADRI D,W < AU MOT SUIVANT,
JDX MOVEV2 < S'IL EXISTE...
PLR W < ET ENFIN, ON RESTAURE L'ADRESSE
< DE LA LRU COURANTE...
JMP MOVEV1 < VERS LA SORTIE...
<
< CAS D'UNE LECTURE :
<
MOVEV3: EQU $
MVTS < IL S'AGIT D'UN MOUVEMENT DE L'ESPACE
< ABSOLU DU SYSTEME VERS L'ESPACE RELATIF
< DE L'UTILISATEUR ('SLO' ET 'SLE' SONT
< CORRECTS)...
PLR X < RESTAURE : (X)=NOMBRE DE MOTS TRANSFERES
<
< SORTIE :
<
MOVEV1: EQU $
RSR
PAGE
<
<
< C O N S T A N T E S G E N E R A L E S :
<
<
XWOR%1: VAL COSBT?FGR=FMASK(K=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
XXCU4:: VAL 8 < TRANSLATION DES FONCTIONS AVEC ATTENTE
< D'INTERRUPTION.
XWOR%2: VAL FGR?XXCU4 < FONCTION LECTURE AVEC IT.
XWOR%1: VAL COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XWOR%2: VAL FGW?XXCU4 < FONCTION ECRITURE AVEC IT.
XWOR%1: VAL COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XXCU1:: VAL XWOR%1 < POUR VALIDER LES FONCTIONS 'CU'.
XXCU2:: VAL 2 < INCREMENT DE LA LONGUEUR DES PILES.
XXCU3:: VAL 32 < POUR LE TEST DES TIME OUT...
< ON LE PREND GRAND A CAUSE DES CONNEXIONS
< EN MODE CANAL DU 'CU2' (IMPRIMANTE
< ELECTROSTATIQUE PAR EXEMPLE...).
XXCUM1:: VAL NOCMO < 'CODEM' LEGAL POUR ACCES AU MOT2,
XXCUM2:: VAL XXCUM1+NOCMO < 'CODEM' LEGAL POUR ACCES AU MOT1.
XXCUMN:: VAL XXCUM2+NOCMO < 'CODEM' MINIMUM POUR PROCEDER A UNE
< ITERATION SUR LE BUFFER (EN PROGRESSANT
< DE MOT EN MOT BIEN SUR) VERS LE MOT2.
XXCUMP:: VAL KOLON*NOCMO < 'CODEM' MAXIMUM D'ITERATION SUR LE MOT2.
< (ON PREND 'KOLON' CAR AINSI, ON PEUT
< ENVOYER UNE CARTE D'UN COUP...)
XXCUMM:: VAL YY8 < 'CODEM' MAXIMUM D'ITERATION SUR LE MOT2,
< CELUI-CI DOIT ALORS ETRE SUPERIEUR A
< 'XXCUMP'...
IF XXCUMP-XXCUMM,XEIF%,,
IF ATTENTION : LA DISCRIMINATION ENTRE LE
IF MOT1 ET LE MOT2 SERA MAUVAISE !!!
XEIF%: VAL ENDIF
IF XXCUMN-XXCUMP,XEIF%,,
IF ATTENTION : LA DISCRIMINATION ENTRE LE MOT1
IF L'ITERATION SUR LE MOT2 EST MAUVAISE !!!
XEIF%: VAL ENDIF
XXNCU:: VAL 32767 < SUPER-TEMPORISATION LORS DES ECHANGES
< SUR LES 'GPI' DUE AU DIALOGUE ENTRE
< UN 'GPI' ET LES REGISTRES DE COULEUR
< DE 'TV' ; CETTDE TEMPORISATION DE
< DETECTION DE TIME-OUT DOIT ETRE SUPE-
< RIEURE A LA DUREE D'UNE TRAME CDE 'TV'...
BUSY2:: VAL ETANXT < SIGNAL .NOT.BUSY2 DANS LE MOT D'ETAT,
BUSY1:: VAL ETAOPE < SIGNAL .NOT.BUSY1 DANS LE MOT D'ETAT.
XCBCU1:: VAL NEXIST < 'CU1' N'A PAS DE MODE CANAL,
XCBCU2:: VAL EXIST < 'CU2' A LE MODE CANAL,
XCBCU3:: VAL NEXIST < 'CU3' N'A PAS LE MODE CANAL.
IF XCBCU1-NEXIST,,XEIF%,
IF ATTENTION : IL FAUT DONNER A 'CU1' UN
IF 'CCB' ET LE PLACER JUSTE DERRIERE 'VARCU1' !!!
XEIF%: VAL ENDIF
IF XCBCU3-NEXIST,,XEIF%,
IF ATTENTION : IL FAUT DONNER A 'CU3' UN
IF 'CCB' ET LE PLACER JUSTE DERRIERE 'VARCU3' !!!
XEIF%: VAL ENDIF
XWOR%1: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
< NOTA : LES ENTREES-SORTIES AVEC INTERRUP-
< TIONS UTILISANT '&VAR+MEMCU', MAIS
< NE POSITIONNANT PAS (SLO,SLE), IL
< EST IMPOSSIBLE DE LES INSERER DANS
< 'DCTFUP' !!!
XCUP1:: VAL XWOR%1 < 'DCTFUP' POUR LES 'CU' N'AYANT PAS LE
< MODE CANAL.
XWOR%1: VAL K < INITIALISATION...
XWOR%1: VAL COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%2: VAL FGR?XXCU4 < FONCTION LECTURE AVEC IT.
XWOR%1: VAL COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XWOR%2: VAL FGW?XXCU4 < FONCTION ECRITURE AVEC IT.
XWOR%1: VAL COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XCUP2:: VAL XWOR%1 < 'DCTFUP' POUR LES 'CU' FONCTIONNANT EN
< MODE CANAL.
CALL #SISP CMS5 CHECK#
PAGE
<
<
< D C T C O U P L E U R U N I V E R S E L 1 :
<
<
CALL #SISP CMS5 DOL1#
DCTCU1: EQU $
PSTCU1: WORD K;K;K;K;COM+DEPCS;DCTCU1;NIL;PILCU1;HANDLR;SMST;SO;SE
#@ASCI " CU1" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XTALOC < ETALOC.
WORD XXLOC0
DZS LSEM
WORD NIL < TETE.
WORD NIL < QUEUE.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLCU < HANDLER SPECIFIQUE 'CUX'.
WORD ITCU < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XXCU3 < TESTO#0 : TIME A OUT A TESTER...
WORD XXCU1 < LISTE DES FONCTIONS AUTORISEES.
WORD XCUP1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARCU: EQU $
VARCU1: EQU VARCU
IF VARCU1-DCTCU1-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACCU1?FPHDUM < LECTURE A PRIORI...
ECHCU:: VAL $-D-VARCU < ECHANGE INFORMATION AVEC CU1.
WORD ACCU1?FPHETA
ETAACU:: VAL $-D-VARCU < ENTREE DU MOT D'ETAT 'A'...
WORD ACCU1?FPHETB
ETABCU:: VAL $-D-VARCU < ENTREE DU MOT D'ETAT 'B'...
WORD ACCU1?FPHCME
CDECU:: VAL $-D-VARCU < SORTIE COMMANDE 'F7'.
WORD ACCU1?FPHCMD
CMDCU:: VAL $-D-VARCU < SORTIE COMMANDE 'F3'.
<
< RELAIS ET DIVERS :
<
WORD NILX
MEMCU:: VAL $-D-VARCU < RELAI VERS LA ZONE MEMOIRE
< CONTENANT OU RECEVANT LE MOT
< D'INFORMATION DU COUPLEUR.
WORD NILK
LONCU:: VAL $-D-VARCU < NOMBRE DE MOTS A ECHANGER.
WORD XXNCU
TXXNCU:: VAL $-D-VARCU < DETECTEUR LOCAL DE TIME-OUT SUR
< LES ECHANGES EN PROGRAMME SIMPLE
< DES 'GPI'...
< NOTA : SI TXXNCU=0, IL N'Y A PAS DE TEST
< DE TIME-OUT, ET LE HANDLER RISQUE
< DE SE BLOQUER LONGUEMENT...
WORD SPCUV
ASPCU:: VAL $-D-VARCU < SOUS-PROGRAMME APPELE APRES LES SORTIES
< ET EN FAIT UTILISE UNIQUEMENT PAR LE
< 'CU3' LORS DE LA GESTION DE LA MEMOIRE
< DES COULEURS.
WORD XCBCU1
XCCBCU:: VAL $-D-VARCU < INDICATEUR PRECISANT SI CE 'CU' POSSEDE
< ('EXIST') OU PAS ('NEXIST') LE MODE
< CANAL.
<
<
< Z O N E S P E C I F I Q U E ' C U 1 ' :
<
<
SPECU1: EQU $
<
<
< P I L E :
<
<
XWPILE: VAL LPILEH+XXCU2
PILCU1:#@EQU $-DEPILE < #SISP CMS5 GENPIL1#
PAGE
<
<
< D C T C O U P L E U R U N I V E R S E L 2 :
<
<
DCTCU2: EQU $
PSTCU2: WORD K;K;K;K;COM+DEPCS;DCTCU2;NIL;PILCU2;HANDLR;SMST;SO;SE
#@ASCI " CU2" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XTALOC < ETALOC.
WORD XXLOC0
DZS LSEM
WORD NIL < TETE.
WORD NIL < QUEUE.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLCU < HANDLER SPECIFIQUE 'CUX'.
WORD ITCU < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XXCU3 < TESTO#0 : TIME-OUT A TESTER...
WORD XXCU1 < LISTE DES FONCTIONS AUTORISEES.
WORD XCUP2 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARCU2: EQU $
IF VARCU2-DCTCU2-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
WORD ACCU2?FPHDUM < ECHANGE INFORMATION AVEC CU2.
WORD ACCU2?FPHETA < ENTREE MOT D'ETAT 'A' DE CU2.
WORD ACCU2?FPHETB < ENTREE MOT D'ETAT 'B' DE CU2.
WORD ACCU2?FPHCME < SORTIE COMMANDE 'F7' SUR CU2.
WORD ACCU2?FPHCMD < SORTIE COMMANDE 'F3' SUR CU2.
WORD NILX < RELAI VERS L'INFO COUPLEUR.
WORD NILK < NOMBRE DE MOTS A ECHANGER.
WORD XXNCU < DETECTEUR LOCAL DE TIME-OUT...
WORD SPCUV < SOUS-PROGRAMME VIDE DE SORTIE.
WORD XCBCU2 < 'CU2' POSSEDE LE MODE CANAL.
<
<
< Z O N E S P E C I F I Q U E ' C U 2 ' :
<
<
SPECU2: EQU $
<
< CONSTANTES DIVERSES :
<
WORD '3FF0
LMCU:: VAL $-D-VARCU2 < LONGUEUR MAXIMALE D'UN ECHANGE CANAL.
WORD ACCU2
INICU:: VAL $-D-VARCU2 < POUR INITIALISER L'ADRESSE DU COUPLEUR
< DE 'CU2' DANS LE 'CCB'.
<
< 'CCB' D'ACCES A 'CU2' :
<
WORD K
CCBCV0:: VAL $-D-VARCU2 < POUR INITIALISER 'CCBCU0'...
WORD K
CCBCV2:: VAL $-D-VARCU2 < POUR INITIALISER 'CCBCU2'...
CCBCU:: VAL $-VARCU2 < 'CCBCU' :
WORD K
CCBCU0:: VAL $-D-VARCU2 < IL S'AGIT D'UN CANAL MOT...
BYTE CCBLDC?XSNCU2;K
< CANAL 'LDC', ET 'ITN'...
WORD NIL
CCBCU2:: VAL $-D-VARCU2 < ADRESSE MOT DU BUFFER.
WORD NILK
CCBCU3:: VAL $-D-VARCU2 < LONGUEUR EN MOTS DE L'ECHANGE.
WORD ACCU2
CCBCU4:: VAL $-D-VARCU2 < ADRESSE DU COUPLEUR DE 'CU2'.
<
< ACCES A 'TTYS' SUR DEFAUT DE 'CU2' :
<
BYTE NSPTYS;XDSYM
TYSCU2:: VAL $-D-VARCU2 < DEMANDE D'EMISSION SUR 'TTYS'...
WORD FGW
DZS LDEM0+VARCU2-$+TYSCU2
<
<
< P I L E :
<
<
XWPILE: VAL LPILEH+XXCU2
PILCU2:#@EQU $-DEPILE < #SISP CMS5 GENPIL1#
PAGE
<
<
< D C T C O U P L E U R U N I V E R S E L 3 :
<
<
DCTCU3: EQU $
PSTCU3: WORD K;K;K;K;COM+DEPCS;DCTCU3;NIL;PILCU3;HANDLR;SMST;SO;SE
#@ASCI " CU3" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS
WORD XTALOC < ETALOC=XTALOC :
< 'CU3' EST PARTAGEABLE AVEC LES ASSIGNS
< IMPLICITES, ET
< 'CU3' EST NON PARTAGEABLES AVEC LES
< !ASSIGN EXPLICITES, QUI INHIBENT
< ALORS LES ASSIGNS IMPLICITES...
WORD XXLOC0
DZS LSEM
WORD NIL < TETE.
WORD NIL < QUEUE.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLCU < HANDLER SPECIFIQUE 'CUX'.
WORD ITCU < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XXCU3 < TESTO#0 : TIME-OUT A TESTER...
WORD XXCU1 < LISTE DES FONCTIONS AUTORISEES.
WORD XCUP1 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARCU3: EQU $
IF VARCU3-DCTCU3-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
WORD ACCU3?FPHDUM < ECHANGE INFORMATION AVEC CU3.
WORD ACCU3?FPHETA < ENTREE MOT D'ETAT 'A' DE CU3.
WORD ACCU3?FPHETB < ENTREE MOT D'ETAT 'B' DE CU3.
WORD ACCU3?FPHCME < SORTIE COMMANDE 'F7' SUR CU3.
WORD ACCU3?FPHCMD < SORTIE COMMANDE 'F3' SUR CU3.
WORD NILX < RELAI VERS L'INFO COUPLEUR.
WORD NILK < NOMBRE DE MOTS A ECHANGER.
WORD XXNCU < DETECTEUR LOCAL DE TIME-OUT...
WORD SPCUC < GESTION DE LA MEMOIRE DES COULEURS.
WORD XCBCU3 < 'CU3' N'A PAS LE MODE CANAL...
<
<
< Z O N E S P E C I F I Q U E ' C U 3 ' :
<
<
SPECU3: EQU $
XWOR%1: VAL SPECU1-DCTCU1
XWOR%2: VAL SPECU2-DCTCU2
XWOR%3: VAL SPECU3-DCTCU3
IF XWOR%1-XWOR%2,,XEIF%,
IF ATTENTION : LES 'DCTCUX' SONT MAUVAISES !!!
XEIF%: VAL ENDIF
IF XWOR%1-XWOR%3,,XEIF%,
IF ATTENTION : LES 'DCTCUX' SONT MAUVAISES !!!
XEIF%: VAL ENDIF
WORD ACCU3?FPHOUT
CUCLIR:: VAL $-D-VARCU3 < POUR LES 'SIO' DE CLEAR DE LA CARTE...
WORD ACCU3?FPHSAD
CUINIT:: VAL $-D-VARCU3 < POUR LES 'SIO' D'INITIALISATION DES
< MEMOIRES DE COULEUR ET DE PROGRAMMATION
< DU CONTROLEUR DE 'CRT'.
WORD SPCU1
ASPCU1:: VAL $-D-VARCU3 < POUR TESTER LE MOT D'ETAT, ET
< ATTENDRE LA LIBERATION...
<
< DEFINITION DU CONTROLEUR DE
< TELEVISION NUMERIQUE BASSE DEFINITION :
<
LICRT: EQU $ < REGISTRES PROGRAMMABLES DU
< CONTROLEUR DE 'CRT' :
BYTE K;'27 < R0=H.TOTAL,
BYTE K;'20 < R1=H.DISPLAYED,
BYTE K;'24 < R2=H.SYNC POSITION ('24 AU LIEU DE '23
< PERMET LE CENTRAGE DES IMAGES CODEES
< EN SECAM...),
BYTE K;'03 < R3=H.SYNC WIDTH,
BYTE K;'26 < R4=V.TOTAL,
BYTE K;'00 < R5=V.SCAN LINE ADJUST,
BYTE K;'20 < R6=V.DISPLAYED,
BYTE K;'22 < R7=V.SYNC POSITION,
BYTE K;'01 < R8=INTERLACE MODE,
BYTE K;'07 < R9=MAX.SCAN LINE ADDRESS,
BYTE K;'05 < RA=CURSOR START,
BYTE K;'06 < RB=CURSOR END,
BYTE K;'00 < RC=START ADDRESS (H),
BYTE K;'00 < RD=START ADDRESS (L),
BYTE K;'01 < RE=CURSOR (H),
BYTE K;'02 < RF=CURSOR (L).
LLICRT:: VAL $-LICRT < LONGUEUR DE LA LISTE DE REINITIALI-
< SATION DU CONTROLEUR DE 'CRT'...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILCU3: EQU $-DEPILE
XWPILE: VAL LPILEH+XXCU2
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< H A N D L E R C O U P L E U R S U N I V E R S E L S :
<
<
< FONCTION :
< CE HANDLER GERE LES 3 COUPLEURS
< DE TYPE 'GPI32' EN PERMETTANT L'ECHANGE
< D'INFORMATION PARALLELES 16 BITS MOT
< PAR MOT AVEC OU SANS IT...
< DANS LE CAS DE 'CU3', ET LORSQU'IL
< S'AGIT D'UN ACCES AU SYSTEME DES COULEURS
< DE LA TELEVISION NUMERIQUE, UNE MEMOIRE
< DES COULEURS EST GEREE ; ON NOTERA
< QUE CELLE-CI A UN CONTENU INITIAL
< QUI NE CORRESPOND PAS A CE QUE LE SYSTEME
< DE TELEVISION NUMERIQUE DIFFUSE, ET
< QU'UNE INITIALISATION S'IMPOSE ; ET
< QUE D'AUTRE PART, APRES UN DEFAUT
< SECTEUR, CETTE MEMOIRE REFLETE CE
< QU'IL Y AVAIT SUR L'ECRAN AVANT CELUI-CI...
< (MAIS VOIR LA 'COPY'...)
<
<
< ARGUMENTS :
< (AMDEM)=ADRESSE OCTET DU BUFFER CONTENANT OU RECEVANT
< L'INFORMATION DU COUPLEUR, MAIS ATTENTION,
< SEUL LE DEUXIEME MOT EST SIGNIFICATIF SI
< CODEM=XXCUM2...
< (OPDEM)=0000 : LECTURE,
< 1000 : LECTURE AVEC ATTENTE D'INTERRUPTION,
< 0010 : ECRITURE,
< 1010 : ECRITURE AVEC ATTENTE INTERRUPTION.
< (CODEM)=XXCUM1 : ACCES AU MOT2 (ANCIEN MODE), ET
< ALORS 'AMDEM' DONNE DIRECTEMENT
< L'ADRESSE DU MOT A ECHANGER.
< XXCUM2 : ACCES AU MOT1 (NOUVEAU MODE),ET
< ALORS 'AMDEM'+NOCMO DONNE L'ADRESSE
< DU MOT A ECHANGER...
< COMPRIS ENTRE XXCUMN ET XXCUMP : ON ITERE SUR LE
< MOT2 (DE L'ANCIEN MODE) (CODEM)/NOCMO
< FOIS EN PROGRESSANT MOT A MOT DANS LE
< BUFFER ARGUMENT.
< COMPRIS ENTRE XXCUMP+NOCMO ET XXCUMM : ON
< ITERE SUR LE MOT1 (CODEM)/NOCMO
< FOIS, EN PROGRESSANT MOT A MOT
< DANS LE BUFFER ARGUMENT, MAIS A
< LA DIFFRENCE DE (CODEM)=XXCUM2,
< 'AMDEM' DONNE DIRECTEMENT L'ADRESSE
< DU PREMIER MOT A ECHANGER.
<
<
< CAS DE 'CU2' :
< LES ECHANGES SUR 'CU2' AVEC DEMANDE
< D'INTERRUPTION (TRANSLATION DES FONCTIONS
< 'XXCU4') SONT ALORS GERES EN MODE CANAL
< 'LDC'...
<
<
XWOR%1: VAL XXCU4=K
IF BIT>XWOR%1-XXCU4,,XEIF%,
IF ATTENTION : 'XXCU4' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
BXCU1:: VAL NBITMO-B-XWOR%1 < NUMERO DU BIT DISCRIMINANT LES APPELS
< AVEC IT DES APPELS SANS IT.
BXCU2:: VAL ETAPIV < BIT 'INFORMATION VALIDE' DU MOT
< D'ETAT UTILISE DU COUPLEUR POUR LE
< MOT2 EN ENTREE ('VAL2').
BXCU5:: VAL ETAFBK < BIT 'INFORMATION VALIDE' DU MOT
< D'ETAT UTILISE DU COUPLEUR POUR LE
< MOT1 EN ENTREE ('VAL1').
<
<
< CODES D'ERREUR :
< 'A0A0 : FONCTION NON RECONNUE,
< '0001 : DEFAUT COUPLEUR (L'OCCUPATION
< N'EST PAS RETOMBEE ASSEZ VITE !!!)
< '0002 : 'CODEM' INCORRECT.
< '0003 : 'AMDEM' IMPAIR...
<
<
< A T T E N T I O N :
< LE MOT D'INFORMATION COUPLEUR
< PEUT AUSSI ETRE UN MOT D'ETAT,
< UNE FONCTION QUE DE L'INFORMA-
< TION AU SENS CLASSIQUE DU TERME...
<
<
USE L,DCT0
USE W,DEM0
<
<
< G E S T I O N D E S E C H A N G E S
< E N M O D E
< C A N A L :
<
<
HDLCU2: EQU $
LA ARGDEM+OPDEM
TBT BXCU1 < EST-CE BIEN UN ECHANGE EN MODE CANAL ???
JNC HDLCUA < NON, ON EST RAMENE AU MODE PROGRAMME
< SIMPLE...
<
< CAS DES ECHANGES CANAUX :
<
LB VAR+INICU < (B)=ADRESSE DU COUPLEUR,
XWOR%1: VAL FGW?FGR=K
TBT NBITMO-B-XWOR%1 < DISCRIMINATION DU SENS DE L'ECHANGE,
ADCR B < ET MISE A JOUR DANS CES CONDITIONS DE
< L'ADRESSE DU COUPLEUR...
IF FPHOUT-FPHIN-I,,XEIF%,
IF ATTENTION : ICI ET AILLEURS, LA
IF MISE A JOUR DE L'ADRESSE D'UN COUPLEUR
IF EN FONCTION DU SENS DE L'ECHANGE EST
IF MAUVAISE !!!
XEIF%: VAL ENDIF
STB VAR+CCBCU4 < ET MISE A JOUR DU 'CCB'.
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTET ARGUMENT DU BUFFER,
SLRS NOCMO=K < CONVERSION EN UNE ADRESSE-MOT :
IF NOCMO=K-W,,XEIF%,
IF ATTENTION : ICI ET AILLEURS DES TESTS
IF D'IMPARITE SUIVANT UN DECALAGE A
IF DROITE SONT MAUVAIS !!!
XEIF%: VAL ENDIF
JC E911CE < ERREUR : L'ADRESSE-OCTET EST IMPAIRE...
STA VAR+CCBCV2 < MISE EN PLACE DE L'ADRESSE-MOT DU
< BUFFER DANS LE 'CCB'...
LA ARGDEM+CODEM < (A)=LONGUEUR OCTET DE L'ECHANGE,
SLRS NOCMO=K < CONVERSION EN UNE LONGUEUR-MOTS,
JC E911E < ERREUR, LA LONGUEUR-OCTETS ETAIT
< IMPAIRE...
CP VAR+LMCU < ET VALIDATION SUPERIEURE :
JG E911E < TROP GRAND...
STA VAR+CCBCU3 < OK, ON MET LA LONGUEUR-MOT DE L'ECHANGE
< DANS LE 'CCB'.
STZ VAR+CCBCV0 < INITILISATION DU PREMIER MOT SUR
< UN CANAL MOT NORMAL...
<
< TEST DE L'ETAT DU COUPLEUR :
<
HDLCUF: EQU $
SIO VAR+ETAACU < (A)=MOT D'ETAT 'A' DU COUPLEUR,
TBT BUSY1 < ALORS, COMMENT EST .NOT.BUSY1 ???
JNC HDLCUD < A 0, TRES MAUVAIS...
TBT BXCU5 < A 1, MAIS ET 'VAL1' ???
JNC HDLCUE < A 0, OK...
HDLCUD: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE POURQUOI LE COUPLEUR EST DANS CET ETAT ???
<
HDLCUG: EQU $
JMP HDLCUF < ET ON RE-TESTE...
HDLCUE: EQU $
<
< ECHANGE PROPREMENT DIT :
<
LAD VAR+CCBCU < (A)=ADRESSE DU 'CCB',
PSR X
SVC SVCM6 < ADRESSE SUR 20 BITS DANS LE 'CCB'...
PLR X
BSR ASDIPI < QUE L'ON TRANSMET AU PROCESSEUR
< GERANT LES ENTREES-SORTIES...
BXCU3:: VAL COMSTR < SELECTION D'UNE SORTIE 'MOT2',
BXCU4:: VAL COMTST < SELECTION D'UNE SORTIE 'MOT1',
XWOR%2: VAL COSBT?COMINT=FMASK(K=FCINST
LAI COSBT?BXCU4=FMASK(K?XWOR%2=FCINST
SIO VAR+CDECU < LANCEMENT DE L'ECHANGE PAR LE 'MOT1',
< QUI EST SEUL RECONNU PAR LE CANAL, ET
< VALIDATION DES INTERRUPTIONS...
BSR ACSWIT < ET ATTENTE DE LA FIN DE L'ECHANGE...
<
< LORS DE LA FIN D'ECHANGE, ON
< VA REGARDER COMMENT TOUT CELA
< S'EST PASSE :
<
LA VAR+CCBCU0
SBT BCCBCR
STA VAR+CCBCU0 < ON MET LE 'CCB' EN MODE COMPTE-RENDU,
LAD VAR+CCBCU
BSR ASDIPI < QUE L'ON ENVOIE AU PROCESSEUR GERANT
< LES ENTREES-SORTIES,
LA VAR+CCBCU3 < (A)=COMPTE-RENDU, QUE L'ON VA ANALYSER :
JAE E914A < TOUT S'EST BIEN PASSE...
<
< CAS DES DEFAUTS :
<
TBT BCCBDC < EST-CE UN DEFSEC/CLEAR ???
JC HDLCU2 < OUI, LE MIEUX EST DE RECOMMENCER...
TBT BCCBME < EST-CE UN DEFAUT MEMOIRE ???
JNC HDLCUB < NON...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< IL CONVIENT DE REPERER SOIT
< LA ZONE FAISANT DES PARITES, SOIT
< DES MEMOIRE INEXISTANTES !!!
<
RBT BCCBME < ON EFFACE LE DEFAUT,
HDLCUB: EQU $
JAE HDLCU2 < LE COMPTE DE MOTS RESIDUELS EST NUL,
< ON RETENTE IMMEDIATEMENT...
LAD VAR+TYSCU2 < ET BIEN NON, LE COUPLEUR, OU CE QUI
< LUI EST RACCORDE EST EN DEFAUT,
XR A,W < (W)=ADRESSE DE LA DEMANDE A 'TTYS',
< ET (A)=SAVE L'ANCIEN 'W'...
BSR ACHAND < ON ENVOIE LA DEMANDE A TTYS,
BSR ACHANW < ET L'ON ATTEND...
LR A,W < PUIS ENFIN, ON RESTAURE 'W'...
XXTCU:: VAL 2 < DUREE DE LA TEMPORISATION INTER-TEN-
< TATIVES SUR 'CU'...
LXI XXTCU
BSR ADODO < ET UN PETIT DODO,
HDLCUC: EQU $
JMP HDLCU2 < ET ON RECOMMENCE TOUT...
<
< SORTIE DU MODE CANAL :
<
E914A: EQU $
LA ETAT1
JMP E914 < LE MOT D'ETAT DU COUPLEUR SERA AINSI
< RENVOYE PAR 'ETAT0'...
<
<
< P O I N T D ' E N T R E E D U H A N D L E R ' C U ' :
<
<
HDLCU: EQU $
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ VAR+XCCBCU < CE 'CU' A-T'IL LE MODE CANAL ???
JNE HDLCU2 < OUI, ALLONS VOIR SI C'EST CE MODE QUI EST
< DEMANDE...
<
<
< C A S D U M O D E P R O G R A M M E ,
< O U D U M O D E N O N C A N A L :
<
<
HDLCUA: EQU $
LAI K
SIO VAR+CDECU < INHIBITION DES INTERRUPTIONS...
<
< DISCRIMINATION MOT1/MOT2 :
<
LAI W
STA VAR+LONCU < A PRIORI, ON NE VA ECHANGER QU'UN SEUL
< MOT.
LB VAR+ECHCU < (B)=ARGUMENT DE LA VRAIE 'SIO' D'E/S...
LX ARGDEM+AMDEM < (X)=ADRESSE DU DEBUT DU BUFFER.
LA ARGDEM+CODEM
CPI XXCUM1 < EST-CE LE MOT2 ???
JE E911A < OUI...
CPI XXCUM2 < EST-CE LE MOT1 ???
JE E911B < OUI...
CPI XXCUMN
JL E911E < ERREUR, TROP PETIT...
SLRS NOCMO=K < LE CODEM EST PEUT-ETRE BON,
< MAIS CORRESPOND-IL A UN NOMBRE ENTIER
< DE MOTS ???
JC E911E < NON, ERREUR...
STA VAR+LONCU < ET OUI, ON A AINSI LE NOMBRE DE MOTS
< A ECHANGER...
CPI XXCUMM/NOCMO < VALIDATION :
JG E911E < ERREUR, TROP GRAND...
CPI XXCUMP/NOCMO < OK, DISCRIMINATION ENTRE L'ITERATION
< SUR LE MOT1 ET LE MOT2 :
JLE E911A < ENTRE 'XXCUMN' ET 'XXCUMP' C'EST
< L'ITERATION SUR LE MOT2 (ANCIEN MODE,
< PAR EXEMPLE POUR PERFORER DES CARTES).
JMP E911F < ENTRE 'XXCUMP' ET 'XXCUMM' C'EST
< L'ITERATION SUR LE MOT1 (NOUVEAU MODE
< POUR ACCEDER L'IMPRIMANTE BENSON EN
< PROGRAMME SIMPLE...).
IF NOCMO=K-W,,XEIF%,
IF ATTENTION : TOUS LES TESTS D'IMPARITE SUIVANT
IF UN DECALAGE A DROITE SONT IMPARFAITS !!!
XEIF%: VAL ENDIF
E911E: EQU $
ECNM:: VAL 2 < CODE D'ERREUR CONCERNANT UN 'CODEM'
< INCORRECT...
LAI ECNM
JMP E914 < VERS LA SORTIE EN ERREUR...
<
< CAS DU MOT2 (ANCIEN MODE) :
<
E911A: EQU $
LYI BUSY2 < (Y)=BIT DE TEST DE .NOT.BUSY2.
XWOR%1: VAL FPHDUM?FPHIN=K < DISCRIMINATION MOT1/MOT2...
XWOR%2: VAL FPHDUM=K
IF BIT>XWOR%2-FPHDUM,,XEIF%,
IF ATTENTION : 'FPHDUM' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
XWOR%2: VAL FPHOUT=K
IF BIT>XWOR%2-FPHOUT,,XEIF%,
IF ATTENTION : 'FPHOUT' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
XWOR%2: VAL FPHIN=K
IF BIT>XWOR%2-FPHIN,,XEIF%,
IF ATTENTION : 'FPHIN' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
SBT NBITMO-B-XWOR%1+NBITMO
< FONCTION 'FPHDUM' (MOT2).
JMP E911C
<
< ACCES AU MOT1 (NOUVEAU MODE) :
<
E911B: EQU $
ADRI XXCUM2-XXCUM1,X < TRANSLATION DE L'ADRESSE DU BUFFER DANS
< D'UN ECHANGE D'UN MOT SUR LE MOT1.
E911F: EQU $ < DANS LE CAS D'UN ECHANGE ITERE SUR LE
< MOT1, 'AMDEM' N'EST PAS TRANSLATE...
< (DUR, DUR...)
LYI BUSY1 < (Y)=BIT DE TEST DE .NOT.BUSY1.
RBT NBITMO-B-XWOR%1+NBITMO
< FONCTION 'FPHIN' (MOT1).
<
< PREPARATION DES ARGUMENTS :
<
E911C: EQU $
STB VAR+ECHCU < FONCTION D'E/S POUR LE 'GPI'.
LR X,A < (A)=ADRESSE OCTET REELLE DU BUFFER,
SLRS NOCMO=K < CONVERSION EN UNE ADRESSE MOT...
JNC E911D < OK, ELLE EST BONNE...
E911CE: EQU $
ECAIM:: VAL 3 < 'AMDEM' IMPAIR...
LAI ECAIM
JMP E914 < VERS LA SORTIE EN ERREUR...
E911D: EQU $
STA VAR+MEMCU < MISE EN PLACE DU RELAI...
<
<
< B O U C L E D ' I T E R A T I O N :
<
<
E911I: EQU $
LA ARGDEM+OPDEM
ANDI MKOPDM < RECUPERATION DE LA FONCTION DEMANDEE...
<
< PREPARATION DE L'OPERATION :
<
LR A,B < (B)=FONCTION DEMANDEE SUR LE CU.
LX VAR+TXXNCU < (X)=NBRE MAX DE TENTATIVES DE
< SIO SUR LE COUPLEUR AUTORISEE,
< AVANT DE LE DECLARER EN ERREUR,
< POUR DESOCCUPATION NON ARRIVEE.
<
< REALISATION DE LA FONCTION :
<
XWOR%1: VAL FGR?FGW=K < DISCRIMINATION LECTURE/ECRITURE...
TBT NBITAB-B-XWOR%1 < TEST LECTURE (0) / ECRITURE (1) ???
JC E912 < C'EST UNE ECRITURE.
<
< L E C T U R E S U R C O U P L E U R U N I V E R S E L :
<
LA VAR+ECHCU
XWOR%1: VAL FPHOUT?FPHIN=K
RBT NBITMO-B-XWOR%1 < MEMORISATION DE LA FONCTION DE LECTURE,
STA VAR+ECHCU < ET MISE A JOUR DE L'ARGUMENT DE 'SIO'...
TBT NBITMO+BXCU1 < DOIT-ON ATTENDRE UNE INTERRUPTION ???
JNC E913 < NON...
LAI MOMINT < OUI :
SIO VAR+CDECU < ET ON VALIDE LES INTERRUPTIONS...
RQST SIT < ATTENTE DES INTERRUPTIONS (PAR 'RQST' ET
< NON PAR 'ACSWIT', ON NE SAIT JAMAIS, AU
< CAS OU ELLES SERAIENT MONTEES ENTRE LEUR
< VALIDATION ET LE 'RQST'...).
LAI K
SIO VAR+CDECU < PUIS, DEVALIDATION DES INTERRUPTIONS...
CPZ ETAT0 < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JE Z1010 < (ETAT0)=0 : INTERRUPTION NORMALE...
JMP Z1011 < (ETAT0)#0 : INTERRUPTION EXCEPTION...
E913: EQU $
SIO VAR+ETABCU < ENTREE DU MOT D'ETAT DANS 'A' :
TBT BXCU2 < L'INFORMATION EST-ELLE VALIDE ???
JNC E913B < NON, ON RECOMMENCE...
SIO VAR+ECHCU < OUI :
< (A)=INFORMATION LUE.
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STA &VAR+MEMCU < SAUVEGARDE DE L'INFORMATION
<*******************************************************************************
JMP Z1010
E913B: EQU $
CPZR X < DOIT-ON DETECTER LE TIME-OUT ???
JE E913 < NON (TXXNCU=0)...
JDX E913 < OUI...
<
< T I M E D - O U T S U R C O U P L E U R :
<
Z1011: EQU $
ECTO:: VAL 1 < 'TIME OUT SUR CU'.
LAI ECTO < (A)=CODE D'ERREUR RENVOYE AU
< DEMANDEUR, BIEN QU'IL NE SOIT
< PAS RESPONSABLE !!!
JMP E914 < VERS LA SORTIE DU HANDLER.
<
< FIN CORRECTE D'UNE 'SIO' DE LECTURE :
<
Z1010: EQU $
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STA &VAR+MEMCU < RENVOI DU MOT LU SUR LE CU.
<*******************************************************************************
<
< ITERATION EVENTUELLE SUR UN MOT SUIVANT :
<
E915: EQU $
IC VAR+MEMCU < ADRESSE DU MOT SUIVANT,
DC VAR+LONCU < S'IL EXISTE...
JG E911I < ET OUI, ON Y VA...
LAI K < RETOUR OK.
E914: EQU $
STA ETAT0 < MISE DANS ETAT0 DU CODE DE RETOUR
RSR < GO BACK.
<
< E C R I T U R E S U R C O U P L E U R U N I V E R S E L :
<
E912: EQU $
LA VAR+ECHCU
XWOR%1: VAL FPHOUT?FPHIN=K
SBT NBITMO-B-XWOR%1 < MEMORISATION DE LA FONCTION D'ECRITURE,
STA VAR+ECHCU < ET MISE A JOUR DE L'ARGUMENT DE 'SIO'.
TBT NBITMO+BXCU1 < DOIT-ON ATTENDRE LES INTERRUPTIONS ???
JNC E912A < NON...
LAI MOMSTR?MOMINT < OUI :
SIO VAR+CDECU < VALIDATION DES INTERRUPTIONS ET MISE DU
< 'MOT2' EN SORTIE...
RQST SIT < ATTENTE DE L'INTERRUPTION (PAR 'RQST' ET
< NON PAR 'ACSWIT', ON NE SAIT JAMAIS...).
LAI K
SIO VAR+CDECU < DEVALIDATION DES INTERRUPTIONS...
CPZ ETAT0 < QUELLE FUT LA NATURE DE L'INTERRUPTION ??
JE E915 < (ETAT0)=0 : INTERRUPTION NORAMLE...
JMP Z1011 < (ETAT0)#0 : INTERRUPTION EXCEPTION...
E912A: EQU $
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LA &VAR+MEMCU < (A)=MOT1/MOT2 A SORTIR...
<*******************************************************************************
SIO VAR+ECHCU < SORTIE DE L'INFORMATION (A) ; CECI
< A POUR EFFET DE FAIRE TOMBER LE
< SIGNAL .NOT.BUSY1/.NOT.BUSY2,
E912B: EQU $
SIO VAR+ETABCU < ENTREE DU MOT D'ETAT DANS 'A',
XR X,Y < (X)=BUSY1/BUSY2...
TBT L,X < .NOT.BUSY1/.NOT.BUSY2 EST-IL REMONTE ???
XR X,Y
JC E915X < OUI, LA SORTIE EST BONNE...
CPZR X < DOIT-ON DETECTER LE TIME-OUT ???
JE E912B < NON (TXXNCU=0)...
JDX E912B < NON, ON RECOMMENCE...
JMP Z1011 < ERREUR : TIME-OUT...
E915X: EQU $
BSR VAR+ASPCU < APRES UNE BONNE SORTIE, ON APPELLE
< LE SOUS-PROGRAMME 'ASPCU'...
JMP E915 < ET ON SORT...
PAGE
<
<
< I N T E R R U P T I O N S U R ' C U X ' :
<
<
< FONCTION :
< SUIVANT LA NATURE DE
< L'INTERRUPTION QUI EST
< MONTEE FAIT :
< 1 - INTERRUPTION NORMALE : 'ITCU'
< PROCEDE A L'ECHANGE DEMANDE, PUIS
< REVEILLE LE HANDLER,
< 2 - INTERRUPTION EXCEPTION : 'ITCU'
< LIT LE MODE D'ETAT AFIN DE FAIRE
< RETOMBER LE SOUS-NIVEAU, PUIS RE-
< VEILLE LE HANDLER.
<
<
< ARGUMENTS:
< (B)=0 : SOUS-NIVEAU NORMAL,
< =1 : SOUS-NIVEAU EXCEPTION.
< (MEMCU)=RELAI INDEXE VERS LE BUFFER D'ECHANGE,
< (ECHCU)=SENS DE L'ECHANGE.
<
<
ITCU: EQU $
STZ ETAT0 < INTERRUPTION NORMALE A PRIORI...
CPZR B < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JNE ITCU2 < INTERRUPTION D'EXCEPTION...
<
< CAS D'UNE INTERRUPTION NORMALE :
<
LA VAR+ECHCU < ACCES AU SENS DE L'ECHANGE :
XWOR%1: VAL FPHOUT?FPHIN=K
TBT NBITMO-B-XWOR%1
JC ITCU1 < CAS D'UNE ECRITURE...
<
< CAS D'UNE LECTURE :
<
SIO VAR+ECHCU < (A)=INFORMATION PRESENTE EN ENTREE,
BSR ATEC < MAIS Y-A-T'IL BIEN UN ECHANGE EN COURS ??
JE ITCU5 < NON, L'INFO LUE EST IGNOREE...
STA &VAR+MEMCU < OUI, MISE DE L'INFORMATION VALIDE DANS
< LE BUFFER...
ITCU5: EQU $
JMP ITCU3
<
< CAS D'UNE ECRITURE :
<
ITCU1: EQU $
LAI K < PAS D'ECHANGE EN COURS A PRIORI...
BSR ATEC < ALORS ???
JE ITCU4 < PAS D'ECHANGE EN COURS...
LA &VAR+MEMCU < OUI, IL Y A UN ECHANGE EN COURS, ON
< PREPARE L'INFORMATION A SORTIR...
ITCU4: EQU $
SIO VAR+ECHCU < QUE L'ON ECRIT SUR LE 'CUX'...
JMP ITCU3
<
< CAS D'UNE INTERRUPTION EXCEPTION :
<
ITCU2: EQU $
CPZ VAR+XCCBCU < CE 'CU' A-T'IL UN MODE CANAL ???
JE ITCU6 < NON...
<
< CAS D'UN FONCTIONNEMENT EN MODE CANAL :
<
SIO VAR+ETAACU < ON RECUPERE LE MOT D'ETAT 'A' POUR FAIRE
< RETOMBER LE SIGNAL D'APPEL EXTERNE
< 'APEX1' ASSOCIE AU MOT1...
XWOR%1: VAL FPHOUT?FPHIN=K
LA VAR+CCBCU4
TBT NBITMO-B-XWOR%1 < EST-CE UNE ENTREE OU UNE SORTIE ???
JNC ITCU7 < UNE ENTREE...
XWOR%2: VAL CORBT?COMINT=FMASK(K=FCINST
XWOR%2: VAL CORBT?BXCU4=FMASK(K?XWOR%2=FCINST
LAI XWOR%2 < UNE SORTIE :
SIO VAR+CDECU < ON INVALIDE LES PORTES DE SORTIE ET
< LES INTERRUPTIONS.
ITCU7: EQU $
LAI CORBT?COMFBK=FMASK(K=FCINST
SIO VAR+CMDCU < ET ON ENVOIE UNE COMMANDE DE FIN DE BLOC.
JMP ITCU8
<
< CAS DU MODE PROGRAMME GERE PAR INTERRUPTIONS :
<
ITCU6: EQU $
SIO VAR+ETABCU < ENTREE MOT D'ETAT 'B'...
ITCU8: EQU $
IC ETAT0
ITCU3: EQU $
BSR ATEC < Y-A-T'IL UNE OPERATION EN COURS ???
JE E911 < NON, IGNORONS L'INTERRUPTION...
BSR ARVHDL < OUI, ON REVEILLE LE 'HANDLER'...
E911: EQU $
RSR
PAGE
<
<
< M E M O I R E D E S C O U L E U R S :
<
<
CALL #SISP CMS5 CHECK#
MCOLOR: EQU $
NCOLOR: EQU MCOLOR < A CAUSE DE REFERENCES EN AVANT...
DO XXCULM
WORD XXCUMB?XXCUMV?XXCUMR
CALL #SISP CMS5 CHECK#
PAGE
<
<
< G E S T I O N D E L A M E M O I R E D E S
< C O U L E U R S P A R ' C U 3 ' :
<
<
SPCUC: EQU $
LR Y,A
CPI BUSY2 < EST-CE LE MOT2 QUE L'ON A ECRIT ???
JNE SPCUC1 < NON, DONC PAS DE COULEURS...
PSR B,X,W
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LB &VAR+MEMCU < (B)=MOT ARGUMENT...
<*******************************************************************************
LRM A,W
WORD XXCUC0)MMOT < (A)=MASQUE DE DETECTION DES BITS DE TETE,
WORD MCOLOR < (W)=BASE DE LA MEMOIRE DES COULEURS.
ANDR B,A
CPR A,B < LES BITS 'XXCUC0' SONT-ILS LA ???
JNE SPCUC2 < OUI, DONC PAS DE COULEURS...
LR A,B < (B)=ARGUMENT DE COLORIAGE...
ANDI XXCUAD
XWOR%1: VAL XXCUAD=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1 < (A)=ADRESSE DES REGISTRES A POSITIONNER..
XEIF%: VAL ENDIF
ADR A,W < (W)=ADRESSE DE LA MEMOIRE DE COULEURS A
< A POSITIONNER...
LR B,A
ANDI XXCUNI
XWOR%1: VAL XXCUNI=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1
XEIF%: VAL ENDIF
LR A,X < (X)=NIVEAU DE LUMINANCE DEMANDE.
<
< GESTION DU CANAL ROUGE EN DIFFUSION :
<
TBT NBITMO+XXCUCR
JNC SPCUC3 < PAS DE ROUGE EN SORTIE EN (W)...
LAI XXCUMR)MMOT
AND O,W < CLEAR LA MEMOIRE,
XWOR%1: VAL XXCUMR=K
IF XWOR%1-K,,XEIF%,
SCRS XWOR%1 < CADRAGE,
XEIF%: VAL ENDIF
ORR X,A < ET CONCATENATION DE LA LUMINANCE,
IF XWOR%1-K,,XEIF%,
SCLS XWOR%1 < ET RECADRAGE,
XEIF%: VAL ENDIF
STA O,W < ET MISE A JOUR DE LA MEMOIRE...
<
< GESTION DU CANAL VERT EN DIFFUSION :
<
SPCUC3: EQU $
TBT NBITMO+XXCUCV
JNC SPCUC4 < PAS DE VERT EN SORTIE EN (W)...
LAI XXCUMV)MMOT
AND O,W < CLEAR LA MEMOIRE,
XWOR%1: VAL XXCUMV=K
IF XWOR%1-K,,XEIF%,
SCRS XWOR%1 < CADRAGE,
XEIF%: VAL ENDIF
ORR X,A < ET CONCATENATION DE LA LUMINANCE,
IF XWOR%1-K,,XEIF%,
SCLS XWOR%1 < ET RECADRAGE,
XEIF%: VAL ENDIF
STA O,W < ET MISE A JOUR DE LA MEMOIRE...
<
< GESTION DU CANAL BLEU EN DIFFUSION :
<
SPCUC4: EQU $
TBT NBITMO+XXCUCB
JNC SPCUC5 < PAS DE BLEU EN SORTIE EN (W)...
LRM A
WORD XXCUMB)MMOT
AND O,W < CLEAR LA MEMOIRE,
XWOR%1: VAL XXCUMB=K
IF XWOR%1-K,,XEIF%,
SCRS XWOR%1 < CADRAGE,
XEIF%: VAL ENDIF
ORR X,A < ET CONCATENATION DE LA LUMINANCE,
IF XWOR%1-K,,XEIF%,
SCLS XWOR%1 < ET RECADRAGE,
XEIF%: VAL ENDIF
STA O,W < ET MISE A JOUR DE LA MEMOIRE...
<
< SORTIE :
<
SPCUC5: EQU $
SPCUC2: EQU $
PLR B,X,W
SPCUC1: EQU $
<
<
< S O U S - P R O G R A M M E V I D E :
<
<
SPCUV: EQU $
RSR
PAGE
<
<
< I N I T I A L I S A T I O N D E L A
< T E L E V I S I O N N U M E R I Q U E :
<
<
< FONCTION :
< CE MODULE IMPLEMENTE ICI, AFIN DE
< BENEFICIER DE 'DCTCU3' INITIALISE
< LA MEMOIRE DES COULEURS, ET LE CON-
< TROLEUR DE 'CRT' (OU REINITIALISE A
< LA SUITE D'UN DEFAUT SECTEUR..).
< LE 'RESTART' SE BRANCHE BRUTALEMENT
< ICI SANS FAIRE DE DEMANDE DE SERVICE
< POUR PLUSIEURS RAISONS :
< 1 - C'EST PEUT-ETRE 'HDLCU3' QUI A
< ETE INTERROMPUE PAR UN EVENTUEL DEFAUT
< SECTEUR, OU BIEN ELLE EST ACTIVE ET NE
< PEUT ACCEPTER PRESENTEMENT DE DEMANDE
< DE SERVICE.
< 2 - IL Y A PEUT ETRE UN !ASSIGN SUR
< LE 'CU3', AUQUEL CAS, LE RESTART NE
< POURRAIT ENVOYER SA DEMANDE...
<
<
XXCWA:: VAL 10 < NOMBRE D'ITERATIONS SUR LE 'DODO'
< D'ATTENTE DE FIN DE PROGRAMMATION
< DU CONTROLEUR DE 'CRT'.
XXCLIR:: VAL 1 < VALEUR A ENVOYER POUR CLEARER LA CARTE
< DE TELEVISION NUMERIQUE.
XXCSEL:: VAL BITSIG < BIT DE SELECTION DU PROGRAMMATEUR DU
< CONTROLEUR DE 'CRT'.
XXCENA:: VAL 4 < BIT 'ENABLE' :
< 0 : LATCH DES VALEURS PRESENTEES,
< 1 : ECRITURE DE CELLES-CI.
XXCADV:: VAL 6 < BIT DE SELECTION :
< 0 : ADRESSE DE REGISTRE,
< 1 : SON CONTENU.
XWOR%1: VAL COSBT?XXCSEL=FMASK(K=FCINST
XWOR%2: VAL CORBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC1:: VAL CORBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC2:: VAL CORBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL CORBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC3:: VAL COSBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL COSBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC4:: VAL COSBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL XXCADV-I?COSBT=FMASK(K?XWOR%1=FCINST
XWOR%2: VAL XXCADV?COSBT=FMASK(K?XWOR%2=FCINST
XWOR%2: VAL XXCADV+I?COSBT=FMASK(K?XWOR%2=FCINST
XXC5:: VAL CORBT?XXCENA=FMASK(K?XWOR%2=FCINST
<
<
< I N I T I A L I S A T I O N G E N E R A L E :
<
<
< ARGUMENT :
< (B)=ADRESSE DE RETOUR (EN EFFET, 'GOCOL'
< N'EST PAS APPELE PAR UN 'BSR'...).
<
<
GOCOL: EQU $
PSR B < SAUVEGARDE DE L'ADRESSE DE RETOUR ; EN
< EFFET, BIEN QUE CONSIDERE COMME UN SOUS-
< PROGRAMME, 'GOCOL' N'EST PAS APPELE PAR
< UN 'BSR'...
LA ETASYS
TBT TVEXIS < MAIS LA TELEVISION NUMERIQUE EST-ELLE LA?
JNC INITC3 < NON, ON NE FAIT RIEN...
PSR X,Y,L,W
LXI NSPCU3
BSR ACADCT < RENVOIE : (A)=(L)=ADRESSE DE 'DCTCU3'...
<
<
< C L E A R T E L E V I S I O N N U M E R I Q U E :
<
<
LYI BUSY1 < POUR TESTER LA DESOCCUPATION...
LAI XXCLIR
SIO VAR+CUCLIR < CLEAR LA CARTE,
BSR VAR+ASPCU1 < ET ATTENTE DE FIN DE CLEAR...
LAI K
SIO VAR+CUCLIR < RETOUR A L'ETAT BAS,
BSR VAR+ASPCU1 < ET ATTENTE DE FIN...
<
<
< I N I T I A L I S A T I O N D U C O N T R O L E U R
< D E ' C R T ' :
<
<
LRM W
WORD LICRT < (W)=ADRESSE DU CONTENU A DONNER AU
< REGISTRE COURANT DE NUMERO (X).
LYI BUSY2 < POUR TESTER LA DESOCCUPATION...
LRM A
WORD XXC5
SIO VAR+CUINIT < "OUVERTURE" DE L'OPERATION...
BSR VAR+ASPCU1 < ET ATTENTE DE FIN D'OUVERTURE...
<
< PROGRAMMATION DU REGISTRE DE NUMERO (X) :
<
LXI K < (X)=NUMERO DE REGISTRE COURANT.
INITC2: EQU $
LRM A
WORD XXC1
ORR X,A
SIO VAR+CUINIT < LATCH DU NUMERO DE REGISTRE.
BSR VAR+ASPCU1 < ET ATTENTE DE FIN DE LATCH...
LRM A
WORD XXC2
ORR X,A
SIO VAR+CUINIT < ECRITURE DU NUMERO DE REGISTRE.
BSR VAR+ASPCU1 < ET ATTENTE DE FIN D'ECRITURE...
LRM A
WORD XXC3
OR O,W
SIO VAR+CUINIT < LATCH DE LA VALEUR DU REGISTRE.
BSR VAR+ASPCU1 < ET ATTENTE DE FIN DE LATCH...
LRM A
WORD XXC4
OR O,W
SIO VAR+CUINIT < ECRITURE DE LA VALEUR DU REGISTRE...
BSR VAR+ASPCU1 < ET ATTENTE DE FIN D'ECRITURE...
ADRI D,W < PASSAGE A LA VALEUR
ADRI I,X < DU REGISTRE SUIVANT
LR X,A
CPI LLICRT < S'IL EXISTE ???
JL INITC2 < OUI...
LRM A
WORD XXC5
SIO VAR+CUINIT < NON, ON "FERME" L'OPERATION...
BSR VAR+ASPCU1 < ET ATTENTE DE FIN DE FERMETURE...
<
<
< A T T E N T E D E F I N D E P R O G R A M M A T I O N
< D U C O N T R O L E U R D E C R T :
<
<
LXI XXCWA
INITC4: EQU $
PSR X
LXI K-I < POUR ATTENDRE UN MAXIMUM...
BSR ADODO < ET ON ATTEND...
PLR X
JDX INITC4 < ET ENCORE, ET TOUJOURS...
<
<
< M E M O I R E D E S C O U L E U R S :
<
<
LXI K < (X)=NUMERO DE REGISTRE COURANT...
LRM W
WORD MCOLOR < (W)=ADRESSE DE L'ENTREE COURANTE.
<
< ITERATION SUR CHAQUE ENTREE :
<
INITC1: EQU $
XWOR%2: VAL XXCUNI=K < POUR LE NIVEAU DE GRIS...
XWOR%3: VAL XXCUAD=K < POUR L'ADRESSE DU REGISTRE...
LAI XXCUMR
AND O,W < ACCES AU NIVEAU DE ROUGE DU REGISTRE
< (X) COURANT,
XWOR%1: VAL XXCUMR=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1 < ET CADRAGE A DROITE...
XEIF%: VAL ENDIF
SCRS XWOR%3-XWOR%2
ORR X,A < CONCATENATION DE L'ADRESSE DU REGISTRE,
SCLS XWOR%3 < ET CADRAGE...
SBT XXCUCR < SELECTION DU CANAL ROUGE...
SIO VAR+CUINIT < INITIALISATION DU CANAL ROUGE DU
< REGISTRE (X),
BSR VAR+ASPCU1 < ET ATTENTE DE FIN...
LAI XXCUMV
AND O,W < ACCES AU NIVEAU DE VERT DU REGISTRE
< (X) COURANT,
XWOR%1: VAL XXCUMV=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1 < ET CADRAGE A DROITE...
XEIF%: VAL ENDIF
SCRS XWOR%3-XWOR%2
ORR X,A < CONCATENATION DE L'ADRESSE DU REGISTRE,
SCLS XWOR%3 < ET CADRAGE...
SBT XXCUCV < SELECTION DU CANAL VERT...
SIO VAR+CUINIT < INITIALISATIION DU CANAL VERT DU
< REGISTRE (X),
BSR VAR+ASPCU1 < ET ATTENTE DE FIN...
LRM A
WORD XXCUMB
AND O,W < ACCES AU NIVEAU DE BLEU DU REGISTRE
< (X) COURANT,
XWOR%1: VAL XXCUMB=K
IF XWOR%1-K,,XEIF%,
SLRS XWOR%1 < ET CADRAGE A DROITE...
XEIF%: VAL ENDIF
SCRS XWOR%3-XWOR%2
ORR X,A < CONCATENATION DE L'ADRESSE DU REGISTRE,
SCLS XWOR%3 < ET CADRAGE...
SBT XXCUCB < SELECTION DU CANAL BLEU...
SIO VAR+CUINIT < INITIALISATION DU CANAL BLEU DU
< REGISTRE (X),
BSR VAR+ASPCU1 < ET ATTENTE DE FIN...
ADRI D,W < PUIS PASSAGE A L'ENTREE SUIVANTE,
ADRI I,X < PASSAGE AU REGISTRE SUIVANT,
LR X,A
CPI XXCULM < S'IL EXISTE ???
JL INITC1 < OUI...
<
< FIN DE L'INITIALISATION :
<
PLR X,Y,L,W
INITC3: EQU $
RSR < ET RETOUR (CORRESPONDANT AU
< 'PSR''B' DE TETE...).
<
<
< T E S T D E D E S O C C U P A T I O N :
<
<
< FONCTION :
< TESTE LA FIN D'UNE OPERATION
< PRECEDEMMENT DEMANDEE ; A NOTER
< QU'IL Y A UN TEST DE TIME-OUT
< DESTINE AU CAS OU LE SYSTEME SERAIT
< ABSENT, MAIS RIEN N'EST FAIT S'IL Y
< A TIME-OUT !!!
<
<
< ARGUMENT :
< (Y)=NUMERO D'UN BIT A TESTER DANS LE MOT D'ETAT.
<
<
< RESULTAT :
< (A)=VALEUR COURANTE DU DETECTEUR DE TIME-OUT.
< (DOIT ETRE DIFFERENTE DE 0 SI OK...)
<
<
SPCU1: EQU $
PSR X
LX VAR+TXXNCU < (X)=DETECTEUR DE TIME-OUT...
SPCU11: EQU $
SIO VAR+ETABCU < (A)=MOT D'ETAT :
XR X,Y
TBT L,X < ALORS C'EST FINI ???
XR X,Y
JC SPCU12 < OUI, OK...
JDX SPCU11 < NON, DETECTION DES TIME-OUT...
<
< NOTA :
< SI ON ARRIVE ICI, IL Y A
< TIME OUT MAIS ON NE FAIT RIEN
< SI CE N'EST QUE L'ON VA FAIRE :
< (A)=(X)=0...
<
SPCU12: EQU $
LR X,A < A EST NUL S'IL Y A TIME OUT...
PLR X
RSR
PAGE
<
<
< C O N S T A N T E S D I V E R S E S ' L P ' :
<
<
XXTLP:: VAL 2 < DUREE DE LA TEMPORISATION ENTRE 2
< MESSAGES SUR 'TTYS'.
XXTOLP:: VAL 8 < DUREE DU DETECTEUR DE 'TIME-OUT'.
XXLP0:: VAL K < INDEX D'OCTET,
XXLP1:: VAL XXLP0+I < DE MEME...
CALL #SISP CMS5 CHECK#
PAGE
<
<
< D C T L P 1 :
<
<
CALL #SISP CMS5 DOL1#
DCTLP1: EQU $
PSTLP1: WORD K;K;K;K;COM+DEPCS;DCTLP1;NIL;PILLP1;HANDLR;SMST;SO;SE
#@ASCI " LP1" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC.
WORD XXLOC0 < SEMLOC
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR 'LP1',
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR 'LP1'.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLLP < HANDLER SPECIFIQUE 'LP1'.
WORD ITLP < ROUTINE SPECIFIQUE D'INTERRUPTION 'LP1'.
WORD K;K < ETAT
WORD COSBT?B0SIT=FMASK(K?'0100=FCINST
< BITSEM : REVEIL SUR DEFAUT SECTEUR.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XXTOLP < TESTO#0 : TIME-OUT A TESTER.
WORD COSBT?FGW=FMASK(K=FCINST
WORD COSBT?FGW=FMASK(K=FCINST
< DCTFUP.
<
<
< Z O N E V A R I A B L E :
<
<
VARLP: EQU $ < ZONE VARIABLE DCTLP1
VARLP1: EQU $
IF VARLP1-DCTLP1-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACLP1?FPHETA
ETALP1:: VAL $-D-VARLP < OPERANDE DE LA 'SIO' ENTREE DU MOT D'ETAT
WORD ACLP1?FPHCMD
CDELP1:: VAL $-D-VARLP < OPERANDE DE LA 'SIO' DE SORTIE COMMANDE.
<
< RELAIS DIVERS :
<
WORD BULP1,X
AXBULP:: VAL $-D-VARLP < RELAI INDEX SUR UN BUFFER 'LP1' ;
< CE BUFFER EST PARFOIS NECESSAIRE
< SI LE BUFFER UTILISATEUR N'EST PAS
< A UNE FRONTIERE DE MOT.
WORD RCLF,X
AXRCLF:: VAL $-D-VARLP < RELAI INDEXE VERS UN MESSAGE 'R/C'-'LF',
< AFIN DE SIMULER LE CODE '6D UTILISABLE
< PAR LES UTILISATEURS (ON N'EST JAMAIS
< TROP AIMABLE), POUR COMPATIBILITE AVEC LE
< AVEC LES VISUS...
<
< INFORMATIONS DE DIMENSIONNEMENT :
<
WORD LMBLP1
NMAXLP:: VAL $-D-VARLP < NOMBRE MAXIMUM D'OCTETS ECHANGEABLES.
WORD W
NMINLP:: VAL $-D-VARLP < NOMBRE MINIMUM D'OCTETS ECHANGEABLES.
WORD NILX
C1MICA:: VAL $-D-VARLP < RELAI D'ACCES AU PREMIER OCTET D'UN
<
< BUFFER A EDITER...
< DEMANDE A 'TTYS' D'AVERTISSEMENT
< DE L'OPERATEUR EN CAS DE NON-
< OPERATIONNALITE DE 'LP1' :
<
BYTE NSPTYS;XDSYM
TYSLP1:: VAL $-D-VARLP
WORD FGW < ECRITURE...
DZS LDEM0+VARLP-$+TYSLP1 < NOTA : CETTE DEMANDE N'EST PAS
< METICULEUSEMENT VALIDEE PAR TTYS...
<
< RELAIS DE SOUS-PROGRAMMES :
<
WORD EDLLP
AEDLLP:: VAL $-D-VARLP < EDITION D'UNE CHAINE D'OCTETS.
<
< 'CCB' DE 'LP1' :
<
WORD K
CCBLQ0:: VAL $-D-VARLP < POUR INITIALISER 'CCBLP0'...
WORD K
CCBLQ2:: VAL $-D-VARLP < ET 'CCBLP2'...
CCBLP:: VAL $-VARLP < 'CCBLP' :
WORD K
CCBLP0:: VAL $-D-VARLP < MOT0.
BYTE CCBLDC?XSNLP1;K
CCBLP1:: VAL $-D-VARLP < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
WORD K
CCBLP2:: VAL $-D-VARLP < MOT2 : ADRESSE-MOT BUFFER.
WORD NILK
CCBLP3:: VAL $-D-VARLP < MOT3 : COMPTE D'OCTETS,
< PUIS COMPTE RENDU...
WORD ACLP1?FPHOUT
CCBLP4:: VAL $-D-VARLP < MOT4 : OPERANDE 'SIO' SORTIE INFORMATION.
<
<
< P I L E :
<
<
XWPILE: VAL LPILEH+16
PILLP1:#@EQU $-DEPILE < #SISP CMS5 GENPIL1#
PAGE
<
<
< C O N S T A N T E S D I V E R S E S ' C R ' :
<
<
XXCR1:: VAL 14+8 < INCREMENT DES LONGUEURS DE PILE.
XXTCR:: VAL 8 < DUREE DE TEMPORISATION ENTRE 2
< MESSAGES SUR 'TTYS'.
XXTOCR:: VAL 8 < DUREE DU DETECTEUR DE 'TIME-OUT'.
FGCRA:: VAL FAVR < FONCTION 'LECTURE ASCI',
FGCRAE:: VAL FAVRE < FONCTION 'LECTURE ASCI AVEC ECHO',
FGCRB:: VAL 8 < FONCTION 'LECTURE BINAIRE'.
XWOR%1: VAL K
XWOR%1: VAL COSBT?FGCRA=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGCRAE=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGCRB=FMASK(K?XWOR%1=FCINST
XXCR2:: VAL XWOR%1 < LISTE DES FONCTIONS RECONNUES.
XWOR%1: VAL K
XWOR%1: VAL COSBT?FGCRA=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGCRAE=FMASK(K?XWOR%1=FCINST
XWOR%1: VAL COSBT?FGCRB=FMASK(K?XWOR%1=FCINST
XXCR3:: VAL XWOR%1 < "ALTITUDES" DES FONCTIONS 'CR'.
PAGE
<
<
< D C T C R 1 :
<
<
DCTCR1: EQU $
PSTCR1: WORD K;K;K;K;COM+DEPCS;DCTCR1;NIL;PILCR1;HANDLR;SMST;SO;SE
#@ASCI " CR1" < #SISP CMS5 ASCI#
BYTE NSPLP1;NOUSER < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC.
WORD XXLOC0 < SEMLOC
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR CR1,
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR CR1.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLCR < HANDLER SPECIFIQUE DES 'CRX'.
WORD ITCR < ROUTINE SPECIFIQUE D'INTERRUPTION 'CRX'.
WORD K;K < ETAT.
XCRMY:: VAL '0200 < CONSTANTE MYSTERIEUSE !??!???!!
WORD COSBT?B0SIT=FMASK(K?XCRMY=FCINST
WORD XXNTRY;TRYVID < NTRIES & FRETRY.
WORD K < HSTATS.
WORD XXTOCR < TESTO#0 : TIME-OUT A TESTER.
WORD XXCR2 < LISTE DES FONCTIONS RECONNUES.
WORD XXCR3 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARCR: EQU $
VARCR1: EQU $
IF VARCR1-DCTCR1-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPERANDES DES 'SIO' :
<
WORD ACCR1?FPHCMD
CDECR1:: VAL $-D-VARCR < ARGUMENT DE 'SIO' DE SORTIE COMMANDE.
WORD ACCR1?FPHETA
ETACR1:: VAL $-D-VARCR < ARGUMENT DE 'SIO' D'ENTREE MOT D'ETAT.
<
< RELAIS :
<
WORD BUCR1
ABUCR:: VAL $-D-VARCR < RELAI D'ACCES A UN BUFFER DE TRANSIT
< UTILISE LORS DES LECTURES 'ASCI'.
WORD BUCR1,X
AXBUCR:: VAL $-D-VARCR < IDEM, MAIS INDEXE...
WORD NILX
AXRCR:: VAL $-D-VARCR < RELAI INDEXE D'ACCES AU BUFFER ARGUMENT.
<
< DEMANDE A 'TTYS' DESTINEE A
< L'OPERATEUR EN CAS DE NON-
< OPERATIONNALITE DE 'CR1' :
<
BYTE NSPTYS;XDSYM
TYSCR1:: VAL $-D-VARCR
WORD FGW < ECRITURE...
DZS LDEM0+VARCR-$+TYSCR1 < NOTA : CETTE DEMANDE N'EST PAS
< METICULEUSEMENT VALIDEE PAR TTYS...
<
< DEMANDE D'ECHO SUR LE PERIPHERIQUE
< ASSOCIE A 'CR1' LORS DES LECTURES
< 'ASCI' AVEC ECHO :
<
BYTE NILK;XDSYM
ECHOCR:: VAL $-D-VARCR < DEMANDE D'ECRITURE SUR LE
< PERIPHERIQUE ASSOCIE A 'CR1'
< PAR L''IOID' DE LA 'DCT'...
WORD FGW < DEMANDE D'ECRITURE.
WORD NIL < AMDEM : CONTIENT L'AMDEM
< ARGUMENT D'UNE DEMANDE A 'CR1'
< LORS D'UN ECHO.
WORD NILK < CODEM : CONTIENT LE CODEM
< ARGUMENT D'UNE DEMANDE A 'CR1'
< LORS D'UN ECHO.
DZS LDEM0+VARCR-$+ECHOCR
<
< 'CCB' DE 'CR1' :
<
WORD K
CCBCR5:: VAL $-D-VARCR < POUR INITIALISER 'CCBCR0'...
WORD K
CCBCS2:: VAL $-D-VARCR < POUR INITIALISER 'CCBCR0'...
CCBCR:: VAL $-VARCR < 'CCBCR' :
WORD K
CCBCR0:: VAL $-D-VARCR < MOT0.
BYTE CCBLDC?XSNCR1;K
CCBCR1:: VAL $-D-VARCR < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
WORD NIL
CCBCR2:: VAL $-D-VARCR < MOT2 : ADRESSE-MOT DU BUFFER.
WORD NILK
CCBCR3:: VAL $-D-VARCR < MOT3 : LONGUEUR-OCTET, PUIS COMPTE RENDU.
WORD ACCR1?FPHIN
CCBCR4:: VAL $-D-VARCR < MOT4 : OPERANDE 'SIO' SORTIE INFORMATION.
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILCR1: EQU $-DEPILE < EMPLACEMENT VARIABLE DANS LA DCT.
XWPILE: VAL LPILEH+XXCR1
CALL #SISP CMS5 GENPIL2#
PAGE
<
<
< D C T C R 2 :
<
<
CALL #SISP CMS5 DOL1#
DCTCR2: EQU $
PSTCR2: WORD K;K;K;K;COM+DEPCS;DCTCR2;NIL;PILCR2;HANDLR;SMST;SO;SE
#@ASCI " CR2" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC.
WORD XXLOC0 < SEMLOC
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE SUR CR2,
WORD NIL < QUEUE DE LA FILE D'ATTENTE SUR CR2.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT.
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLCR < HANDLER SPECIFIQUE DES 'CRX'.
WORD ITCR < ROUTINE SPECIFIQUE D'INTERRUPTION 'CRX'.
WORD K;K < ETAT.
WORD COSBT?B0SIT=FMASK(K?XCRMY=FCINST
WORD XXNTRY;TRYVID < NTRIES ET FRETRY.
WORD K < HSTATS.
WORD XXTOCR < TESTO#0 : TIME-OUT A TESTER.
WORD XXCR2 < LISTE DES FONCTIONS RECONNUES.
WORD XXCR3 < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
< Z O N E V A R I A B L E :
<
<
VARCR2: EQU $
IF VARCR2-DCTCR2-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
WORD ACCR2?FPHCMD < OPERANDE 'SIO' DE SORTIE COMMANDE.
WORD ACCR2?FPHETA < OPERANDE 'SIO' D'ENTREE DE MOT D'ETAT.
<
< RELAIS :
<
WORD BUCR2 < RELAI D'ACCES BUFFER CR2 (ASCI).
WORD BUCR2,X < RELAI INDEXE D'ACCES A 'BUCR2'.
WORD NILX < RELAI INDEXE CALCULE.
<
< DEMANDE A 'TTYS' EN CAS DE NON-
< OPERATIONNALITE DE 'CR2' :
<
BYTE NSPTYS;XDSYM
TYSCR2:: VAL $-D-VARCR2
WORD FGW < ECRITURE...
DZS LDEM0+VARCR2-$+TYSCR2
<
< DEMANDE D'ECHO SUR LE PERIPHERIQUE
< ASSOCIE A 'CR2' LORS DES LECTURES
< 'ASCI' AVEC ECHO :
<
BYTE NILK;XDSYM
ECHOC2:: VAL $-D-VARCR2 < DEMANDE D'ECRITURE SUR LE
< PERIPHERIQUE ASSOCIE A CR2
< PAR L'IOID DE LA DCT.
WORD FGW < DEMANDE D'ECRITURE.
WORD NIL < AMDEM : CONTIENT L'AMDEM
< ARGUMENT D'UNE DEMANDE A 'CR2'
< LORS D'UN ECHO.
WORD NILK < CODEM : CONTIENT LE CODEM
< ARGUMENT D'UNE DEMANDE A 'CR2'
< LORS D'UN ECHO.
DZS LDEM0+VARCR2-$+ECHOC2
<
< 'CCB' DE 'CR2' :
<
WORD K < POUR INITIALISER LE MOT0,
WORD K < ET LE MOT2...
WORD K < MOT0.
BYTE CCBLDC?XSNCR2;K < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
WORD NIL
WORD NILK
WORD ACCR2?FPHIN
WORD K < POUR INITIALISER 'CCBCR0'...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILCR2: EQU $-DEPILE < EMPLACEMENT VARIABLE DANS LA DCT.
XWPILE: VAL LPILEH+XXCR1
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< H A N D L E R I M P R I M A N T E :
<
<
< FONCTION :
< TRES SIMPLEMENT, REALISER
< LA SORTIE DEMANDEE, EN SIMU-
< LANT EVENTUELLEMENT LE CODE
< '6D DES VISUS.
<
<
< ARGUMENTS :
< (L)=ADRESSE DE LA 'DCT' CORRESPONDANTE,
< (W)=ADRESSE DE LA DEMANDE COURANTE (DE TETE),
< (A)='NSPTYP' DE LA DEMANDE COURANTE.
<
<
USE L,DCT0
USE W,DEM0
HDLLP: EQU $
CALL #SISP CMS5 PSRSLO#
<
< INITIALISATION DU RELAI D'ACCES AU
< PREMIER CARACTERE DU MESSAGE A EDITER :
<
<
< NOTA :
<
< LE 'MOT2' DU 'CCB' CONTIENT
< UNE ADRESSE-MOT ; SI MALHEUREU-
< SEMENT LE MESSAGE ARGUMENT A EDI-
< TER N'EST PAS A UNE FRONTIERE DE
< MOTS, IL CONVIENT DE LE TRANSFERER
< DANS UN BUFFER LOCAL 'BUFLP'...
<
LA ARGDEM+AMDEM < ACCES A L'ADRESSE D'OCTETS DU
< BUFFER D'EMISSION.
BSR AMEM < RENVOIE :
< (A)= RELAI D'INDIRECTION INDEXE
< VERS LE BUFFER,
< (X)=0 : SI LE PREMIER OCTET EST A GAUCHE,
< =1 : SI LE PREMIER OCTET EST A DROITE.
STA VAR+C1MICA < GENERATION DU RELAI D'ACCES AU
< 1ER CARACTERE.
CPZR X < EST-ON A UNE FRONTIERE DE MOT OU
< D'OCTET ???
JE HDLLP3 < OK, DE MOT...
<
< D'OCTET, IL FAUT TRANSFERER
< DANS LE BUFFER LOCAL :
<
LY VAR+NMAXLP
NGR Y,Y < POUR LE DECOMPTAGE DES OCTETS...
HDLLP4: EQU $
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LBY &VAR+C1MICA
<*******************************************************************************
ADRI -I,X
STBY &VAR+AXBULP < TRANSFERT DU CARACTERE COURANT,
ADRI I+I,X < ET PASSAGE
ADRI I,Y < AU SUIVANT...
CPZR Y < S'IL EXISTE...
JL HDLLP4 < OUI...
LXI XXLP0 < POUR LA SUITE...
LA VAR+AXBULP
STA VAR+C1MICA < GENERATION DU RELAI D'ACCES AU BUFFER...
CALL #SISP CMS5 PAGE0#
HDLLP3: EQU $
<
< VALIDATION DE LA DEMANDE ARGUMENT :
<
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE :
CPI FGW < EST-CE BIEN UNE ECRITURE ???
JNE ERLP11 < NON, ERREUR...
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DU MESSAGE,
CP VAR+NMAXLP < VALIDATION SUPERIEURE :
JG ERLP13 < ERREUR, TROP GRAND...
CP VAR+NMINLP < VALIDATION INFERIEURE :
JL ERLP13 < ERREUR, TROP PETIT...
<
< FAUT-IL SIMULER LE CODE '6D ???
<
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LBY &VAR+C1MICA
<*******************************************************************************
CPI K6D < Y-A-T'IL UN CODE '6D EN TETE ???
JNE HDLLP1 < NON...
<
< SIMULATION DU CODE '6D :
<
LA ARGDEM+CODEM
LB VAR+C1MICA
PSR A,B < SAUVEGARDE LONGUEUR MESSAGE ET
< RELAI D'ACCES AU PREMIER CARACTERE DU
< MESSAGE...
CALL #SISP CMS5 PSRSLO#
CALL #SISP CMS5 PAGE0#
LAI LXRCLF < (A)=LONGUEUR DU MESSAGE 'RC-LF'.
STA ARGDEM+CODEM < ET MISE DANS LA DEMANDE...
LA VAR+AXRCLF
STA VAR+C1MICA < GENERATION DU RELAI A 'R/C'-'LF',
BSR VAR+AEDLLP < ET EDITION DU MESSAGE 'R/C'-'LF'...
CALL #SISP CMS5 PLRSLO#
PLR A,B
STA ARGDEM+CODEM < RESTAURATION DU 'CODEM',
STB VAR+C1MICA < ET DU RELAI D'ACES AU MESSAGE.
<
< TEST SUR LA LONGUEUR
< DE L'ECHANGE :
<
CPI NOCMO-Z < N'Y-A-T'IL QU'UN CARACTERE A IMPRIMER ???
JLE HDLLP2 < OUI, C'EST FINI...
LAI KNUL < NON, ON SUBSTITUE UN 'NULL' AU CODE
< '6D DE DEBUT DE LIGNE...
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STBY &VAR+C1MICA
<*******************************************************************************
BSR VAR+AEDLLP < EDITION DU MESSAGE ARGUMENT...
LAI K6D
HDLLP6: EQU $
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STBY &VAR+C1MICA < RESTAURATION DU CODE '6D...
<*******************************************************************************
JMP HDLLP2 < VERS LA SORTIE...
<
< CAS OU IL N'Y A PAS
< DE CODE '6D EN TETE :
<
HDLLP1: EQU $
LXI XXLP1
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LBY &VAR+C1MICA < (A)=CARACTERE DE TETE :
<*******************************************************************************
CPI KAROND < EST-CE LE "A-ROND" ???
JNE HDLLP5 < NON...
<
< OUI, TRAITEMENT DU SAUT DE PAGE :
<
LAI KFF < (A)=CARACTERE 'FORM-FEED',
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STBY &VAR+C1MICA < QUE L'ON MET EN TETE DU BUFFER...
<*******************************************************************************
BSR VAR+AEDLLP < EDITION DU MESSAGE AVEC SAUT DE PAGE...
LAI KAROND
JMP HDLLP6 < VERS LA RESTAURATION DU "A-ROND"...
<
< CAS NORMAL :
<
HDLLP5: EQU $
BSR VAR+AEDLLP < EDITION DU MESSAGE TEL QUEL...
<
< SORTIE DU HANDLER :
<
HDLLP2: EQU $
STZ ETAT0
HDLLPS: EQU $ < SORTIE...
CALL #SISP CMS5 PLRSLO#
RSR
<
<
< E R R E U R S S O F T W A R E :
<
<
ECRLP1:: VAL '11 < 'FONCTION CR/LP ERRONEE'.
ECRLP3:: VAL '05 < 'LONGUEUR ERRONEE'.
ERLP11: EQU $ < FONCTION DEMANDEE ERRONNEE LP1,
ERCR11: EQU ERLP11 < FONCTION DEMANDEE ERRONNEE CR1.
LAI CORBT?NBITMO-B=FMASK(K?ECRLP1=FCINST
JMP E42
ERLP13: EQU $ < LONGUEUR ERRONNEE LP1,
ERCR13: EQU ERLP13 < LONGUEUR ERRONNEE CR1.
LAI CORBT?NBITMO-B=FMASK(K?ECRLP3=FCINST
E42: EQU $
SBT NBITMO-B < MEMORISATION "ERREUR SOFTWARE",
STA ETAT0 < ET TRANSMISSION DU CODE D'ERREUR PAR
< 'ETAT0'...
JMP HDLLPS < VERS LA SORTIE...
PAGE
<
<
< E D I T I O N D ' U N E L I G N E :
<
<
< ARGUMENTS:
< (L)=ADRESSE DE LA 'DCT' CORRESPONDANTE,
< (W)=ADRESSE DE LA DEMANDE COURANTE, VALIDEE,
< MAIS DONT LES ARGUMENTS ONT PU ETRE
< MODIFIES...
<
<
EDLLP: EQU $
<
< INITIALISATION DE L'IMPRIMANTE :
<
LAI MOMINI
SIO VAR+CDELP1 < ENVOI DE LA FONCTION DE 'RESET'...
<
< CONSTRUCTION DU 'CCB' :
<
LA VAR+C1MICA < (A)=RELAI-MOT INDEXE D'ACCES AU MESSAGE,
RBT BITX < ON EFFACE L'INDEXATION,
STA VAR+CCBLQ2 < (MOT2)=ADRESSE-MOT DU BUFFER.
LA ARGDEM+CODEM
STA VAR+CCBLP3 < (MOT3)=LONGUEUR-OCTETS DU BUFFER.
EDLLP1: EQU $
LAI K
SBT BCCBBM < MISE DE L'IMPRIMANTE EN MODE OCTET,
STA VAR+CCBLQ0 < ET GENERATION SYSTEMATIQUE DU MOT0...
LAD VAR+CCBLP < (A)=ADRESSE DU 'CCB',
PSR X
SVC SVCM6 < EXTENSION D'ADRESSE SUR 20 BITS DANS
< LE 'CCB'...
PLR X
<
< ECHANGE PROPREMENT DIT :
<
BSR ASDIPI < ENVOI DU 'CCB' A L''IOP'...
LAI MOMRW?MOMSTR?MOMINT
SIO VAR+CDELP1 < 'SIO' DE LANCEMENT DE L'ECHANGE...
BSR ACSWIT < ET ATTENTE DE L'INTERRUPTION ; N'OUBLIONS
< QU'ON TROUVE AU RETOUR DANS 'ETAT0' LE
< MOT D'ETAT...
LA ETAT0 < (A)=SOMME DES DEFAUTS :
JAGE EDLLP3 < OK, PAS DE DEFAUT...
<
< CAS OU IL Y A UN DEFAUT :
< ON VA AVERTIR L'OPERATEUR,
< PUIS RETITERER L'OPERATION :
<
LAD VAR+TYSLP1
XR A,W < (W)=ADRESSE DE LA DEMANDE A 'TTYS',
< (A)=ADRESSE DE LA DEMANDE COURANTE 'LP1'.
BSR ACHAND < ENVOI DE LA DEMANDE A 'TTYS',
BSR ACHANW < ET ATTENTE DE FIN D'EMISSION SUR 'TTYS'..
LR A,W < ET RESTAURE :
< (W)=ADRESSE DE LA DEMANDE SUR 'LP1'.
PSR X
LXI XXTLP
BSR ADODO < MISE EN SOMMEIL DU HANDLER
< PENDANT 2 SECONDES...
PLR X
EDLLP5: EQU $
JMP EDLLP1 < ET ON RECOMMENCE...
<
< FIN D'ECHANGE :
<
EDLLP3: EQU $
LA VAR+CCBLP0
SBT BCCBCR
STA VAR+CCBLP0 < MISE DU 'CCB' EN MODE COMPTE-RENDU...
LAD VAR+CCBLP < (A)=ADRESSE DU 'CCB',
BSR ASDIPI < ET DEMANDE DE COMPTE-RENDU A L''IOP'...
LA VAR+CCBLP3 < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
< COMPTE-RENDU DU CANAL 'HDC' SUR
< LES BITS 0-1 POUR L'ETAT, ET 2-15
< POUR LE COMPTE DE MOTS RESIDUELS :
< SIGNIFICATION DES BITS 0-1 :
< =00 : OK, TOUT S'EST BIEN PASSE,
< =01 : L'ECHANGE S'EST ARRETE SUR UN
< DEFAUT SECTEUR, OU UN 'INI',
< =10 : UNE PARITE MEMOIRE A ETE RENCON-
< TREE AU COURS DE L'ECHANGE,
< =11 : UNE MEMOIRE INEXISTANTE A ETE
< RENCONTREE AU COURS DE L'ECHANGE.
< LES BITS 2-15, QUANT A EUX, DONNENT LE
< COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
< GE (NORMALEMENT NUL...).
JAE EDLLP4 < OK, PAS D'ERREUR...
JAG SYSRBL < IL Y A UN DEFAUT '01...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< RELANCER L'ECHANGE PAR UN 'JMP HDLLP'...
<
JMP EDLLP < ET ON RELANCE...
SYSRBL: EQU $
TBT BCCBDC < (A)>0 : Y-A-T'IL EU UN DEFAUT SECTEUR
< OU UN 'INI' ???
JC EDLLP < OUI, ON RECOMMENCE LA SORTIE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT LE COMPTE
< D'OCTETS RESIDUELS PEUT ETRE
< NON NUL !!!
< PUIS, ON RELANCERA L'ECHANGE
< EN SIMULANT UN 'JMP''HDLLP'...
<
JMP EDLLP < ET ON RELANCE...
EDLLP4: EQU $
RSR < THAT'S ALL FOLK...
PAGE
<
<
< R O U T I N E D ' I N T E R R U P T I O N ' L P ' :
<
<
< RAPPEL :
< L'IMPRIMANTE FONCTION EN MODE
< CANAL 'LDC' ; DONC, EN FIN D'E-
< CHANGE, ON DOIT RECUPERER UNE
< INTERRUPTION D'EXCEPTION, POUR
< LA DESARMER, ON LIT LE MOT D'ETAT
< DANS 'ETAT0' QUE L'ON TRANSMET
< DONC AU HANDLER QUE L'ON REVEIL-
< LE ENSUITE...
<
<
< ARGUMENT :
< (B)=0 : INTERRUPTION NORMALE,
< =1 : INTERRUPTION EXCEPTION.
< (L)=ADRESSE DE LA 'DCT' EN CAUSE.
<
<
ITLP: EQU $
CPZR B < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JNE SYSRBM < D'EXCEPTION, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT UNE
< INTERRUPTION NORMALE A PU
< MONTER !!!
<
SYSRBM: EQU $
SIO VAR+ETALP1 < (A)=MOT D'ETAT,
STA ETAT0 < ET STOCKAGE DANS 'ETAT0'...
BSR ATEC < Y A-T-IL UN ECHANGE EN COURS ???
JE ITLP1 < NON, PAS DE REVEIL...
BSR ARVHDL < OUI, REVEIL DU HANDLER...
ITLP1: EQU $
RSR
PAGE
<
<
< H A N D L E R L E C T E U R D E C A R T E S :
<
<
< FONCTION :
< LE HANDLER LECTEUR DE CARTES
< A A SA CHARGE DE GERER LES
< LECTEURS DE CARTES, ET D'ASSURER
< LES LECTURES BINAIRE ET 'ASCI'...
<
<
< ARGUMENTS :
< (L)=ADRESSE DE LA 'DCT' EN CAUSE,
< (W)=ADRESSE DE LA DEMANDE A TRAITER (CELLE DE TETE),
< (A)='NSPTYP' DE LA DEMANDE COURANTE.
< (OPDEM)=0 : LECTURE ASCI,
< =1 : LECTURE ASCI AVEC ECHO SUR LE
< PERIPHERIQUE ASSOCIE,
< =8 : LECTURE BINAIRE.
<
<
USE L,DCT0
USE W,DEM0
HDLCR: EQU $
CALL #SISP CMS5 PSRSLO#
HDLCRI: EQU $
<
< VALIDATION DE LA DEMANDE :
<
LA NSPTYP < (A)='NSPTYP' (RESTAURATION...),
LB ARGDEM+CODEM < (B)=LONGUEUR-OCTETS DU BUFFER,
LY ARGDEM+OPDEM < (Y)=FONCTION DEMANDEE :
ADRI -FGCRAE,Y < (Y)=FONCTION-1...
LA ARGDEM+OPDEM < (A)=FONCTION DEMANDEE :
JAE HDLCR1 < OK, LECTURE 'ASCI'...
IF FGCRA-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSUS EST MAUVAIS !!!
XEIF%: VAL ENDIF
CPI FGCRAE < EST-CE LA LECTURE 'ASCI' AVEC ECHO ???
JE HDLCR1 < OUI, OK...
CPI FGCRB < EST-CE LA LECTURE BINAIRE ???
JNE ERCR11 < NON, ERREUR...
<
< CAS DE LA LECTURE BINAIRE :
<
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTET DU BUFFER :
TBT NBITMO-B < EST-ON BIEN A UNE FRONTIERE DE MOTS ???
JC ERCR13 < NON (ADRESSE IMPAIRE), ERREUR...
SLRD NOCMO=K < LA LONGUEUR EST-ELLE PAIRE ???
< N'OUBLIONS PAS, QUE D'APRES LE TEST
< PRECEDENT :
< BIT15(A)=0...
JC ERCR13 < NON, ERREUR...
HDLCR1: EQU $
LR B,A < (A)=(B)=LONGUEUR OU LONGUEUR/2 SUIVANT...
JALE ERCR13 < ERREUR, LONGUEUR NEGATIVE OU NULLE !!!
CPI LCCI < VALIDATION...
JG ERCR13 < ERREUR, BUFFER TROP LONG !!!
<
< ECHANGE PROPREMENT DIT :
<
HDLCR2: EQU $
<
< CONSTRUCTION DU 'CCB' :
<
STZ VAR+CCBCR5 < POUR LE FUTUR 'CCBCR0'...
LAI K
CPZR Y < TEST DE LA FONCTION-1 DANS 'Y' :
< C'EST-A-DIRE :
< -1 : 'ASCI',
< 0 : 'ASCI' AVEC ECHO,
< 7 : LECTURE BINAIRE.
JG HDLCR3 < CAS DE LA LECTURE BINAIRE...
<
< CAS DE LA LECTURE 'ASCI'
< (AVEC OU SANS ECHO) :
<
SBT BCCBBM < AFIN DE METTRE LE CANAL EN MODE OCTET,
STA VAR+CCBCR5 < POUR LE FUTUR 'CCBCR0'...
LA VAR+ABUCR
STA VAR+CCBCS2 < ON UTILISE SYSTEMATIQUEMENT 'BUCRX',
< CAR L'ADRESSE (AMDEM) N'EST PAS FORCEMENT
< PAIRE, ET QUE SURTOUT, ON DOIT PARCOU-
< RIR TOUTE LA CARTE LUE AFIN DE RAZER LE
< BIT DE PARITE DE CHAQUE CARACTERE...
CALL #SISP CMS5 PAGE0# < ON PASSE SUR LA PAGE 0, PUISQUE LE
< BUFFER UTILISE EST LOCAL A 'CR'...
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS DE LA CARTE A LIRE.
JMP HDLCR4 < VERS LE LANCEMENT DE L'ECHANGE...
<
< CAS DE LA LECTURE BINAIRE :
<
HDLCR3: EQU $
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTETS (PAIRE) ARGUMENT,
SLRS NOCMO=K < (A)=ADRESSE-MOT ARGUMENT,
STA VAR+CCBCS2 < QUE L'ON MET EN 'MOT2'...
LA ARGDEM+CODEM < (A)=LONGUEUR-OCTETS (PAIRE),
SLRS NOCMO=K < (A)=LONGUEUR-MOTS DE L'ECHANGE.
<
< LANCEMENT DE L'ECHANGE :
<
HDLCR4: EQU $
STA VAR+CCBCR3 < MISE EN PLACE DU 'MOT4' QUI CONTIENT
< LA LONGUEUR EN MOTS OU EN OCTETS,
< SUIVANT LA VALEUR DU BIT 'BCCBBM'.
HDLCR5: EQU $
SIO VAR+ETACR1 < (A)=MOT D'ETAT DU PERIPHERIQUE :
TBT ETAFBS < LE MAGASIN EST-IL VIDE ???
< NOTA : CE BIT N'EST PAS RAZE PAR LA
< LECTURE DU MOT D'ETAT, IL PEUT DONC
< ETRE "VIEUX"...
JC HDLCRB < LE MAGASIN EST VIDE, ALLONS AVERTIR
< L'OPERATEUR...
LAI MOMINI
SIO VAR+CDECR1 < ENVOI DE LA COMMANDE 'RESET'...
LAI MOMTST
SIO VAR+CDECR1 < ENVOI DE LA COMMANDE DE MISE SOUS
< TENSION...
LAD VAR+CCBCR < (A)=ADRESSE DU 'CCB',
PSR X
SVC SVCM6 < EXTENSION D'ADRESSE SUR 20 BITS DANS
< LE 'CCB'...
PLR X
BSR ASDIPI < ENVOI DU 'CCB' A L''IOP'...
LAI MOMSTR?MOMINT < LECTURE BINAIRE A PRIORI...
CPZR Y < ALORS, BINAIRE OU 'ASCI' ???
JG HDLCR6 < LECTURE BINAIRE...
SBT COM8 < LECTURE 'ASCI'...
HDLCR6: EQU $
SIO VAR+CDECR1 < PUIS, LANCEMENT DE L'ECHANGE...
BSR ACSWIT < ET ATTENTE DE L'INTERRUPTION DE FIN
< D'ECHANGE ; ON TROUVERA AU RETOUR, LE
< MOT D'ETAT DANS 'ETAT0'...
<
< ANALYSE DES CONDITIONS
< D'ECHANGE :
<
LA ETAT0 < (A)=MOT D'ETAT DU PERIPHERIQUE :
JAGE HDLCR7 < BIT0=0 : PAS DE DEFAUT A PRIORI...
IBT ETAOPE < IL Y A DEFAUT, ON INVERSE DONC LE BIT
< 'ETAOPE' (NON PRET) POUR ETRE COHERENT
< AVEC LES AUTRES BITS DE DEFAUT...
LRM B
WORD MTADEF?MTAFBS?MTAFBK?MTAOPE
CPR A,B < EST-CE MAGASIN VIDE OU FIN DE BLOC ???
JE HDLCR7 < C'EST LE DEFAUT "MAGASIN VIDE" :
< ON L'IGNORE POUR LA CARTE QU'ON
< VIENT DE LIRE. IL SERA DETECTE
< AVANT LA LECTURE SUIVANTE
< S'IL Y EN A...
<
< CAS DES DEFAUTS, AVERTISSONS
< L'OPERATEUR :
<
HDLCRB: EQU $
LAD VAR+TYSCR1
XR A,W < (W)=ADRESSE DEMANDE SUR 'TYS',
< (A)=ADRESSE DEMANDE SUR 'CRX',
BSR ACHAND < ET ENVOI DU MESSAGE A L'OPERATEUR...
BSR ACHANW < ET ATTENTE DE FIN D'EMISSION SUR 'TYS'...
LR A,W < RESTAURE :
< (W)=ADRESSE DE LA DEMANDE SUR 'CRX'.
LXI XXTCR
BSR ADODO < MISE EN SOMMEIL DU HANDLER
< PENDANT 2 SECONDES...
HDLCRH: EQU $
JMP HDLCR5 < ET APRES LE DODO, ON RETENTE...
<
< COMPTE-RENDU DE L'ECHANGE :
<
HDLCR7: EQU $
LA VAR+CCBCR0
SBT BCCBCR
STA VAR+CCBCR0 < MISE DU 'CCB' EN MODE COMPTE-RENDU...
LAD VAR+CCBCR < (A)=ADRESSE DU 'CCB',
BSR ASDIPI < ENVOI DE LA DEMANDE DE COMPTE-RENDU
< A L''IOP'...
LA VAR+CCBCR3 < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
< COMPTE-RENDU DU CANAL 'HDC' SUR
< LES BITS 0-1 POUR L'ETAT, ET 2-15
< POUR LE COMPTE DE MOTS RESIDUELS :
< SIGNIFICATION DES BITS 0-1 :
< =00 : OK, TOUT S'EST BIEN PASSE,
< =01 : L'ECHANGE S'EST ARRETE SUR UN
< DEFAUT SECTEUR, OU UN 'INI',
< =10 : UNE PARITE MEMOIRE A ETE RENCON-
< TREE AU COURS DE L'ECHANGE,
< =11 : UNE MEMOIRE INEXISTANTE A ETE
< RENCONTREE AU COURS DE L'ECHANGE.
< LES BITS 2-15, QUANT A EUX, DONNENT LE
< COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
< GE (NORMALEMENT NUL...).
JAE HDLCR8 < OK, PAS DE DEFAUTS...
JAG SYSRBN < C'EST PEUT-ETRE LE DEFAUT SECTEUR
< OU L''INI'...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< REPERER LES PARITES MEMOIRE
< OU LES MEMOIRES INEXISTANTES,
< PUIS RELANCER PAR UN 'JMP''HDLCRI'...
<
JMP HDLCR2 < ET ON RELANCE...
SYSRBN: EQU $
TBT BCCBDC < (A)>0 : EST-CE UN DEFAUT SECTEUR OU
< UN 'INI' ???
JC HDLCR2 < OUI, LE MIEUX EST DE RELANCER L'ECHANGE..
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT LE NOMBRE
< D'OCTETS RESIDUELS PEUT ETRE NON
< NUL, PUIS RELANCER L'ECHANGE PAR
< UN 'JMP''HDLCRI'...
<
JMP HDLCR2 < ET ON RELANCE...
HDLCR8: EQU $
<
<
< C A D R A G E D E S I N F O R M A T I O N S :
<
<
CALL #SISP CMS5 PLRSLO#
LA ARGDEM+AMDEM < (A)=ADRESSE-OCTET DU BUFFER ARGUMENT,
BSR AMEM < RENVOIE :
< (A)=RELAI INDEXE VERS LE BUFFER,
< (X)=0 : FRONTIERE "PAIRE",
< =1 : FRONTIERE "IMPAIRE".
STA VAR+AXRCR < MISE EN PLACE DU RELAI DE CADRAGE...
CPZR Y < ALORS, LECTURE 'ASCI' OU BINAIRE ???
JG HDLCRE < BINAIRE, ALLONS CADRER LES MOTS
< A GAUCHE...
<
< ' A S C I ' : R A Z D U B I T D E P A R I T E :
<
LR X,Y < (Y)=INCREMENT DE DEPHASAGE DU AU
< PROBLEME DES FRONTIERES "PAIRES"
< ET "IMPAIRES"...
LB ARGDEM+CODEM < (B)=NOMBRE D'OCTETS A TRANSFERER...
NGR B,B < QUE L'ON INVERSE...
LXI K < (X)=INDEX D'ACCES AUX BUFFERS.
HDLCR9: EQU $
LBY &VAR+AXBUCR < (A)=CARACTERE 'ASCI' COURANT,
RBT BITPAR < RAZ DE SON BIT DE PARITE.
JAE HDLCRD < LES 'NULLS' SONT REMPLACES PAR 'R/C'...
CPI KSOUL < ET LE '5F PAR 'EOT'...
JNE HDLCRC < CAS DES CODES NORMAUX...
LAI KEON-KCR < POUR GENERER UN 'EOT'.
HDLCRD: EQU $
ADRI KCR,A < GENERATION DE 'EOT' OU 'R/C' SUIVANT...
STX ARGDEM+CODEM < AFIN DE RENVOYER LE NOMBRE
IC ARGDEM+CODEM < DE CARACTERES RENTRES...
HDLCRC: EQU $
ADR Y,X < (X)=INDEX DE TRANSFERT,
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STBY &VAR+AXRCR < TRANSFERT DU CARACTERE 'ASCI' COURANT...
<*******************************************************************************
SBR Y,X < RESTAURATION DE L'INDEX DE RECUPERATION.
ADRI I,X < PASSAGE AU
ADRI I,B < CARACTERE SUIVANT...
CPZR B < S'IL EXISTE ???
JL HDLCR9 < ET OUI...
LX ARGDEM+CODEM < (X)=NOMBRE DE CARACTERES LUS,
BSR ASTBOX < ET ENVOI EVENTUEL DANS LA 'BOX'...
<
< E C H O E V E N T U E L :
<
CPZ ARGDEM+OPDEM < L'ECHO EST-IL DEMANDE ???
IF FGCRAE-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%: VAL ENDIF
JE HDLCRA < NON...
<
< CAS OU L'ECHO EST DEMANDE
< SUR LE PERIPHERIQUE ASSOCIE :
<
LBY IOID < (A)='NSP' DU PERIPHERIQUE ASSOCIE,
JAE HDLCRA < N'EXISTE PAS, PAS D'ECHO...
IF XIOID0-K,,XEIF%,
IF ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%: VAL ENDIF
LR A,X < (X)=NSP DU PERIPHERIQUE 'OUT'...
LBI XXNLOC < POUR NE PAS ATTENDRE,
BSR ALODCT < LOCATION DE LA DCT(NSP=(X)) SANS ATTENTE
< AU CAS OU ELLE SERAIT DEJA LOUEE...
CPZR B < ALORS ???
IF XXNLOC-K,,XEIF%,
IF ATTENTION : SI UNE DCT N'EST PAS LOUABLE,
IF ON A AU RETOUR (B)=XXNLOC, ET LE TEST EST MAUVAIS !!!
XEIF%: VAL ENDIF
JNE HDLCRG < ET BIEN LE PERIPHERIQUE 'OUT' EST
< DEJA LOUE, ON SE DISPENSE DONC DE
< L'UTILISER...
STBY VAR+ECHOCR+XXNSP
< MISE EN PLACE DU 'NSP' (A) DU PERI-
< PHERIQUE D'ECHO.
LA ARGDEM+AMDEM
STA VAR+ECHOCR+T+AMDEM
< TRANSMISSION DE L'ADRESSE-OCTETS.
LA ARGDEM+CODEM
STA VAR+ECHOCR+T+CODEM
< TRANSMISSION DE LA LONGUEUR-OCTETS.
<
< DEMANDE D'ECHO :
<
LAD VAR+ECHOCR
XR A,W < (W)=ADRESSE DE LA DEMANDE D'ECHO,
< (A)=ADRESSE DE LA DEMANDE A 'CRX'.
BSR ACHAND < ENVOI DE LA DEMANDE D'ECHO,
BSR ACHANW < ET ATTENTE DE FIN D'ECHO...
LR A,W < RESTAURE :
< (W)=ADRESSE DE LA DEMANDE COURANTE
< DESTINEE A 'CRX'.
BSR ADLDCT < DELOCATION DE DCT(NSP=(X))...
HDLCRG: EQU $
<
< F I N N O R M A L E D E L A L E C T U R E :
<
HDLCRA: EQU $
STZ ETAT0 < RETOUR OK...
RSR
HDLCRE: EQU $
<
< L E C T U R E B I N A I R E : R E C A D R A G E :
<
DC VAR+AXRCR < DECREMENTATION DU RELAI POUR
< UTILISER LE 'JDX'...
LXI LCCI < (X)=INDEX D'ACCES.
HDLCRF: EQU $
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
LA &VAR+AXRCR < (A)=MOT COURANT,
<*******************************************************************************
XXCRNL:: VAL 12 < NOMBRE DE LIGNES SUR UNE CARTE...
SLLS NBITMO-XXCRNL < CADRAGE (12=12 LIGNES/COLONNE), PAR
< DECALAGE A GAUCHE DE CHAQUE COLONNE...
<*******************************************************************************
BSR ASIMUL < SIMULATION DE L'INSTRUCTION SUIVANTE :
STA &VAR+AXRCR < ET RENVOI DU MOT DECALE...
<*******************************************************************************
JDX HDLCRF < PASSAGE AU MOT SUIVANT...
JMP HDLCRA < PUIS VERS LA SORTIE...
PAGE
<
<
< R O U T I N E D ' I N T E R R U P T I O N ' C R ' :
<
<
< RAPPEL :
< CETTE ROUTINE RECUPERE LES
< INTERRUPTIONS 'CRX' ; ETANT DONNE
< QUE LES ECHANGES SE FONT EN
< CANAL 'LDC', ON NE PEUT THEO-
< RIQUEMENT QUE RECUPERER DES
< INTERRUPTIONS D'EXCEPTION (EN
< FIN D'ECHANGE) ; 'ITCR' LIT LE
< MOT D'ETAT AFIN DE LA DESARMER,
< LE TRANSMET A 'HDLCR', QU'IL
< REVEILLE AU PASSAGE...
<
<
< ARGUMENT :
< (B)=1 : INTERRUPTION EXCEPTION (CE QUI EST NORMAL...),
< =0 : INTERRUPTION NORMALE (CE QUI EST EXCEPTIONNEL...).
<
<
ITCR: EQU $
CPZR B < QUELLE EST LA NATURE DE L'INTERRUPTION ??
JNE SYSRBO < EXCEPTION, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT UN
< INTERRUPTION NORMALE A
< PU ARRIVER !!!
<
SYSRBO: EQU $
SIO VAR+ETACR1 < (A)=MOT D'ETAT DU PERIPHERIQUE,
STA ETAT0 < QUE L'ON TRANSMET PAR 'ETAT0'...
BSR ATEC < Y A-T-IL UN ECHANGE EN COURS ???
JE ITCR1 < NON, DONC PAS DE REVEIL...
BSR ARVHDL < OUI, REVEIL DU HANDLER...
ITCR1: EQU $
RSR
PAGE
<
<
< E N V O I D E S ' I P I ' C A N A U X :
<
<
< FONCTION :
< CE SOUS-PROGRAMME COMPLEXE
< EST CHARGE DE TRANSMETTRE DES
< 'CCB' A L''IOP', PUIS D'ATTEN-
< DRE QUE CEUX-CI FUSSENT PRIS
< EN COMPTE.
< LORSQUE LE PROCESSEUR 'IOP'
< N'EST PAS LE PROCESSEUR MAITRE,
< L'INSTRUCTION 'IPI' EST UTILI-
< SEE POUR CE FAIRE, DANS L'AUTRE
< CAS, POUR DES PROBLEMES D'ININ-
< TERRUPTIBILITE, ON NE PEUT
< L'UTILISER, ON FAIT DONC UN
< SAUT DIRECT DANS LES MICRO-
< PROGRAMMES A L'AIDE DE 'ROMB'...
<
<
< ARGUMENT:
< (A)=ADRESSE DU 'CCB'.
<
IPI: EQU $
<
< INITIALISATIONS :
<
PSR X,Y,W
LRM W < (W)=ADRESSE DE BOXIPI
WORD BOXIPI
PSR A < SAUVEGARDE DE L'ADRESSE DU 'CCB'...
<
< EST-CE UN AUTO-ENVOI ???
<
ZIPIB: EQU $
LXI PROIOP
LA &SYSPRO < (A)=NUMERO DE L'IOP...
LYI NIL-ZERO < (Y)=K : A PRIORI LE MAITRE N'EST PAS L'IO
IF NIL-ZERO-ALIPI,XEIF%,,XEIF%
IF ATTENTION : LES TESTS SUR (Y) SONT IDIOTS !!!
XEIF%: VAL ENDIF
LXI PROMST
CP &SYSPRO < QU'EN EST-IL REELLEMENT ???
JNE ZIPI6 < (Y)=K : MAITRE #IOP.
LYI ALIPI < (Y)=ALIPI#0 : LE MAITRE EST AUSSI L'IOP,
< Y CONTIENT ALORS L'ADRESSE DU MICRO-
< PROGRAMME DE TRAITEMENT DES 'IPI'...
ZIPI6: EQU $
JAGE ZIPI2 < OK, IL EXISTE...
BSR ASYSER < E R R E U R S Y S T E M E ...
JMP ZIPIB < ET ON RECOMMENCE APRES CORRECTION.
<
< VERROUILLAGE DE LA
< BOITE A LETTRES :
<
ZIPI2: EQU $
ADR A,W < (W)=ADRESSE BOITE AUX LETTRE IOP.
LAI VLOCK < (A)=VALEUR DE VERROUILLAGE D'UN VERROU...
ZIPI3: EQU $
BSR ASMMK < MASQUAGE GENERAL DES INTERRUPTIONS.
XM XVEROU,W < ON TENTE DE VERROUILLER L'ACCES
< A LA BOITE A LETTRES D'ADRESSE (W).
JAE ZIPI5 < OK, ON L'A EUE...
BSR ASMDK < ET BIEN NON, IL FAUT DEMASQUER LES
< INTERRUPTIONS AFIN DE PERMETTRE A
< DES INTERRUPTIONS INTER-PROCESSEURS
< DE PASSER (EN PROVENANCE DE L'ESCLAVE).
JMP ZIPI3 < ET ON RE-TENTE LE VERROUILLAGE...
<
< MISE EN PLACE DU 'CCB' :
<
ZIPI5: EQU $ < YOUPI, ON A LA BOITE A LETTRES...
PLR A < RESTAURE : (A)=ADRESSE DU 'CCB'...
STA O,W < CHARGEMENT DE BOXIPI
<
< ENVOI DE L'IPI, OU ITERATION SUR ENVOI :
<
CPZR Y < LE MAITRE EST-IL L'IOP ???
JNE ZIPI7 < OUI, PAS D'IPI...
IPI < NON, ON ENVOIE DONC UN IPI, ON PEUT
< LE FAIRE BIEN QUE LES INTERRUPTIONS
< DE CE PROCESSEUR SOIENT MASQUEES...
JMP ZIPI8
ZIPI7: EQU $ < LE MAITRE EST L'IOP...
ROMB < ON FAIT UN BRANCHEMENT FORCE AU
< TRAITEMENT DES INTERRUPTIONS 'IPI',
< PLUTOT QU'UN 'IPI', CAR EN EFFET, LES
< INTERRUPTIONS ETANT MASQUEES, CET 'IPI'
< SERAIT DIFFERE, ET LE TEST DE REMISE
< A 0 DE LA BOITE A LETTRES, PRECEDANT LE
< DEVERROUILLAGE (CES 2 ACTIONS ETANT
< MASQUEES), SERAIT UN TEST BLOQUANT.
< EN FAISANT UN FORCAGE PAR 'ROMB', ON
< PASSE PAR DESSUS LE SYSTEME D'INTERRUP-
< TION ET SON MASQUAGE (ASTUCE...).
ZIPI8: EQU $
TEMIPI:: VAL 1000 < TEMPORISATION ARBITRAIRE DE DETECTION
< DES TIME-OUT SUR 'IPI'...
LRM X
WORD TEMIPI < (X)=NOMBRE DE TEST SUR LA BOITE A LETTRES
< AVANT DE DECRETER UNE 'SYSER'...
ZIPI4: EQU $
CPZ O,W < L'IPI A-T'IL ETE PRIS EN COMPTE ???
JE ZIPI9 < OUI, LA BOITE A LETTRES A ETE REMISE A 0.
BSR ATDEFS < NON, ALORS ON TESTE LE DEFAUT SECTEUR
< EVENTUELLEMENT EN ATTENTE ; ON EST
< OBLIGE DE LE FAIRE, CAR L'IOP DESIRE
< PEUT ETRE EN DEFAUT DE LONGUE DUREE...
JDX ZIPI4 < ON TEMPORISE...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< REGARDER POURQUOI L'IOP DESIRE
< NE REPOND PAS ; RAPPELONS A CE PROPOS
< QUE METTRE UN LECTEUR DE CARTES HORS
< TENSION A POUR CONSEQUENCE DE BLOQUER
< UN IOP...
<
BLOCK3: EQU $ < ADRESSE DE BLOCAGE LORS DE LA RELANCE
< SUITE A UN DEFAUT SECTEUR NON PRIS EN
< COMPTE...
STZ XVEROU,W < ON LIBERE LE VERROU...
BSR ASMDK < ON DEMASQUE,
PLR X,Y,W < ON RESTAURE,
JMP IPI < ET ON RETENTE, AU CAS OU PAR EXEMPLE
< LE PROCESSEUR 'IOP' AURAIT ETE CHANGE
< MANUELLEMENT AU PUPITRE...
<
< DEVERROUILLAGE, ET SORTIE :
<
ZIPI9: EQU $
STZ XVEROU,W < ENFIN, ON PEUT DEVEROUILLER...
BSR ASMDK < DEMASQUAGE DES INTERRUPTIONS.
PLR X,Y,W
RSR
PAGE
<
<
< A L L O C A T I O N D E L ' E S P A C E D I S Q U E
< S U R L E D I S Q U E A M O V I B L E
<
<
< PHILOSOPHIE :
< L'ESPACE DISQUE 'DKM' EST ALLOUE
< PAR Q-SECTEURS ; LA TABLE D'ALLOCA-
< TION CORRESPONDANTE ('TOGB') ETANT
< TROP VOLUMINEUSE EST CHARGE EN O-
< VERLAY ; L'ESPACE ALLOUABLE EST
< DIT DECOUPE EN 'GB', UN 'GB' (OU
< 'GRAND BLOC') CORRESPONDANT A LA
< PARTIE RESIDENTE DE 'TOGB'. CHAQUE
< 'GB' EST DECOUPE EN 'YY7' SOUS-
< BLOCS (OU 'SB'), DONT LA SOUS-
< TABLE D'ALLOCATION FAIT UN MOT.
< ON PEUT DONC DIRE :
< ESPACE 'DKM'='NSTO'*'GB',
< 'GB' ='YY7'*'SB',
< 'SB' ='NBITMO'*'Q-SECTEURS'.
<
<
< NOTA :
< L'UNITE D'ALLOCATION EST LE
< Q-SECTEUR, ET NON PAS LE SECTEUR
< AFIN DE POUVOIR ADRESSER L'ENSEM-
< BLE DU DISQUE SUR 16 BITS !!!
<
<
< NOTATIONS :
< A UN INSTANT DONNE, ON N'AURA
< DONC PRESENT EN MEMOIRE QU'UN
< SEUL 'GB', DIT 'GRAND BLOC COU-
< RANT' (OU 'GBC'), DONT LE NUMERO+1
< (A CAUSE DES 'JDX') EST 'NUGBC'...
<
<
< NOTA :
< TOUS LES 'GB' SONT LIBRES SUR LE DISQUE AMOVIBLE
< A L'INITIALISATION DU SYSTEME. L'ESPACE DISQUE
< PRIVE DE CMS5 EST EN EFFET IMPLANTE SUR LE DISQUE
< FIXE (TOGB, TP, ARBRE DU SYSTEME, PROCESSEUR DE
< BASE ET SWAPPING). LE SECTEUR 'INFINI' EST IN-
< PAR L'ALLOCATEUR, CAR IL Y AURAIT CONFUSION
< AVEC L'INDICATEUR DE FIN DE CHAINE...
<
<
< ATTENTION :
< PAR LA SUITE, ON POURRA PARLER DE
< SECTEURS, MAIS IL FAUDRA ENTENDRE
< GROUPE DE 'QUANTA' SECTEURS ; IL FAUDRAIT
< AVOIR LE COURAGE DE MODIFIER TOUS
< LES COMMENTAIRES...
<
<
CALL #SISP CMS5 CHECK#
<
<
< B U F F E R D E S Q - S E C T E U R S
< D E S T I N E A ' H D L R E L ' P O U R
< S A V O I R S ' I L S S O N T M A U V A I S ...
<
<
LBUFHS:: VAL QUANTA-E*YY7+D < AVEC CETTE LONGUEUR ON EST SUR DE
< CALCULER LE CHECKSUM DE CHAQUE SECTEUR
< COMPOSANT UN Q-SECTEUR ; CETTE LONGUEUR
< EST MINIMALE...
BUFHS: DZS LBUFHS < BUFFER DESTINE A 'HDLREL' POUR SAVOIR
< SI LES SECTEURS RELEASES SONT BONS
< OU MAUVAIS...
<
<
< O P T I M I S E U R D U P A R C O U R S D E ' T O G B ' :
<
<
CALL #SISP CMS5 DOL1#
SB1: WORD YY7 < CE MOT CONTIENT EN PERMANENCE
< LE NUMERO DU 1ER 'SB' A TESTER
< DANS UN 'GB'. IL PERMET DONC
< DE MINIMISER LE TEMPS DE PARCOURS
< D'UNE 'TOGB'.
CALL #SISP CMS5 DOL2#
PAGE
<
<
< D C T A L L O C A T E U R D I S Q U E :
<
<
CALL #SISP CMS5 DOL1#
DCTGET: EQU $
PSTGET: WORD K;K;K;K;COM+DEPCS;DCTGET;NIL;PILGET;HANDLR;SMST;SO;SE
#@ASCI " GET" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC.
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE DES
< DEMANDES D'ALLOCATION DISQUE.
WORD NIL < ET QUEUE...
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT (INUTILISE).
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLGET < HANDLER D'ALLOCATION DE L'ESPACE 'DKM'.
WORD NIL < PAS DE 'RIT' EVIDEMMENT...
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XTESTO < TESTO.
WORD XXDCTF < 'DCT' NON CONNECTABLE...
WORD NOSOSE < DCTFUP ("ALTITUDES" DES FONCTIONS).
< NOTA : IL FAUT RESTER DANS LA PAGE 0 !!!
<
<
< Z O N E V A R I A B L E :
<
<
VARGET: EQU $
IF VARGET-DCTGET-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPTIMISATION DES PARCOURS :
<
WORD SB1
GETSB1:: VAL $-D-VARGET < ACCES AU MOT 'SB1'.
<
< DEMANDE DE TRANSFERT
< DE 'TOGB' SUR 'DKA' :
<
BYTE NSPDKA;XDSYM < NSPTYP.
EGBGR:: VAL $-D-VARGET
XWOR%1: VAL VAR-DCT0
XEGBGR: EQU ZERO+XWOR%1+EGBGR
WORD FGR < OPDEM=0 : LECTURE,
< =2 : ECRITURE.
WORD TOGB+IJIJDX-ZERO*NOCMO < AMDEM.
WORD YY8 < CODEM.
WORD NILS < ASDEM.
DZS LDEM0+VARGET-$+EGBGR
<
< VALIDATION DES SECTEURS ALLOUES :
<
BYTE NSPDKM;XDSYM?XTYPAD
DEMHSG:: VAL $-D-VARGET < DEMANDE DE LECTURE D'UN SECTEUR :
WORD FGR < LECTURE,
WORD BUFHS-ZERO
WORD LBUFHS*NOCMO
WORD NILS
GECTHS:: VAL $-D-VARGET < ADRESSE DU SECTEUR A LIRE.
DZS LDEM0+VARGET-$+DEMHSG
WORD KQSHS
NQSHSG:: VAL $-D-VARGET < RELAI VERS LE COMPTEUR DE SECTEURS "HS".
<
< ACCES A LA 'LRU' DES 'GB' QUI
< TEND A FAVORISER L'ALLOCATION
< DES Q-SECTEURS DANS LES ZONES
< LES PLUS UTILISEES LE PLUS
< RECEMMENT :
<
WORD TLRUGB,X
ALRUAL:: VAL $-D-VARGET < RELAI D'ACCES A LA 'LRU' DES 'GB'...
<
< DONNEES D'OPTIMISATION DE L'ALLOCATION :
<
SEULIN:: VAL K < SEUIL DES MOTS DE &ANSLGB INITIAL.
WORD SEULIN
SEULSB:: VAL $-D-VARGET < CE MOT DONNE LE SEUIL COURANT AUQUEL
< ON COMPARE LES NOMBRE DE Q-SECTEURS
< LIBRES PAR GRAND BLOC...
< CE SEUIL VAUT 'NSL' DIVISE PAR LE DOUBLE
< DE GRAND-BLOC ; C'EST DONC LA MOITIE DU
< NOMBRE DE Q-SECTEURS LIBRES MOYEN PAR
< GRAND BLOC...
XWOR%1: VAL XXXMOY=K
XWOR%2: VAL -XWOR%1
IF SDKM>XWOR%2>XWOR%1-SDKM,,XEIF%,
IF ATTENTION : 'SDKM' N'EST PAS DIVISIBLE EXACTEMENT
IF PAR 'XXXMOY' ET EN PLUS EST UN NOMBRE NEGATIF !!!
XEIF%: VAL ENDIF
XWOR%3: VAL NBSPGB/XXXMOY
WORD SDKM>XWOR%2/XWOR%3*XXXMOY
SEULDV:: VAL $-D-VARGET < POUR CALCULER 'SEULSB' ; C'EST EN FAIT
< LE NOMBRE DE 'GB' ALLOUABLES...
SEULGB:: VAL 128 < VALEUR PLANCHER DE 'SEULSB' EN DESSOUS
< DE LAQUELLE IL EST MIS A 'SEULIN'.
WORD SEULGB
SEULCP:: VAL $-D-VARGET < LE SEUIL 'SEULSB' SERA UN MULTIPLE DE
< DE 'SEULCP' AFIN DE DEFAVORISER L'ECLA-
< TEMENT DES ITEMS ET L'EPARPILLEMENT DES
< FICHIERS LORSQU'ON SE TROUVE TOUT PRES
< DE CE SEUIL...
< NOTA : EN FORCANT UNE VALEUR SUPERIEURE
< (ET NON PAS EGALE, A CAUSE DU 'SB
< ARGDEM+CODEM') ON EST RAMENE A L'ANCIEN-
< NE STRATEGIE D'ALLOCATION DISQUE...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILGET: EQU $-DEPILE
XWPILE: VAL LPILEH+15
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< L E C T U R E / E C R I T U R E D E ' T O G B ' :
<
<
< ARGUMENT :
< (X)=NUMERO+1 DU 'GB' A LIRE OU ECRIRE.
<
<
< RESULTAT :
< (W)=ADRESSE DE LA DEMANDE A 'DKA' AFIN DE
< PERMETTRE LE 'WAIT' DE FIN D'OPERATION,
< (SB1)=POSITIONNE UNIQUEMENT PAR 'ROGB',
< LES CODES 'V' ET 'C' POSITIONNES PAR 'CHANW'.
<
<
< A T T E N T I O N :
< 'WOGB' DETRUIT 'A' ET 'X',
< 'ROGB' DETRUIT 'A'.
<
<
<
<
< E C R I T U R E S U R ' D K A ' :
<
<
WOGB: EQU $
WOGBLA: EQU $ < ADRESSE DU 'LAD'...
<*******************************************************************************
LAD 0,L < POUR GENERER LE CODE DU 'LAD'...
XWOR%1: VAL '0000000@@00
<*******************************************************************************
$EQU WOGBLA < RETOUR SUR LE 'LAD'...
WORD XEGBGR+XWOR%1 < 'LAD VAR+EGBGR'...
LR A,W < (W)=ADRESSE DE LA DEMANDE A 'DKA'.
ADRI XXGB-IJIJDX,X < CALCUL DU NUMERO DE SECTEUR
< DE LA 'TOGB' ARGUMENT,
STX ARGDEM+ASDEM < QUE L'ON RANGE DANS 'ASDEM'.
LAI FGW
STA ARGDEM+OPDEM < L'ECHANGE EST UNE ECRITURE,
BSR ACHAND < ENVOI DE LA DEMANDE D'ECRITURE SUR 'DKA',
BSR ACHANW < ET ATTENTE DE FIN D'ECHANGE...
RSR < THAT'S ALL FOLK...
<
<
< L E C T U R E S U R ' D K A ' :
<
<
ROGB: EQU $
PSR X
WORD XEGBGR+XWOR%1 < 'LAD VAR+EGBGR'...
LR A,W < (W)=ADRESSE DE LA DEMANDE A 'DKA'.
ADRI XXGB-IJIJDX,X < CALCUL DU NUMERO DE SECTEUR
< DE LA 'TOGB' ARGUMENT,
STX ARGDEM+ASDEM < QUE L'ON RANGE DANS 'ASDEM'.
STZ ARGDEM+OPDEM < L'ECHANGE EST UNE LECTURE.
IF FGR-K,,XEIF%,
IF ATTENTION : L'INITIALISATION PRECEDENTE EST IDIOTE !!!
XEIF%: VAL ENDIF
BSR ACHAND < ENVOI DE LA DEMANDE DE LECTURE A 'DKA'.
LXI YY7 < NUMERO DU DERNIER 'SB' D'UN 'GB',
STX &VAR+GETSB1 < &VAR+GETSB1C INITIALISE AVEC
< LE SOMMET DE 'TOGB' ; EN EFFET, ON NE
< CONNAIT PAS LE 'GB' QUE L'ON CHARGE,
< IL FAUDRA LE PARCOURIR EN ENTIER LES
< PREMIERES FOIS...
PLR X
BSR ACHANW < ET ATTENTE DE FIN DE LECTURE...
RSR < ET C'EST TOUT...
PAGE
<
<
< H A N D L E R D ' A L L O C A T I O N D I S Q U E :
<
<
< ARGUMENTS :
< (L)=ADRESSE DE LA 'DCT' D'ALLOCATION,
< (W)=ADRESSE DE LA DEMANDE D'ALLOCATION :
< (AMDEM)=ADRESSE-MOT DE LA ZONE OU RENVOYER
< LE OU LES SECTEURS ALLOUES,
< (CODEM)=NOMBRE DE SECTEURS DEMANDES.
<
<
< ATTENTION :
< 'AMDEM' CONTIENT UNE ADRESSE DE
< MOTS ET NON PAS D'OCTETS ; 'CODEM'
< DE MEME CONTIENT UN NOMBRE DE MOTS
< CORRESPONDANT AU NOMBRE DE Q-SECTEURS
< A ALLOUER.
< DE PLUS AUCUNE VERIFICATION N'EST
< FAITE, CAR SEUL L'OPERATING SYSTEME
< UTILISE CES HANDLERS (GET & REL)...
<
<
< FORMAT D'UNE ADRESSE SECTEUR :
< L'ADRESSE D'UN SECTEUR EST DONNEE SOUS FORME D'
< UN MOT :
< BITS 0-4 =NUMERO DE 'GB',
< BITS 5-11 =NUMERO DE 'SB',
< BITS 12-15=NUMERO DE SECTEUR (DANS LE 'SB').
<
<
USE L,DCT0
USE W,DEM0
HDLGET: EQU $
<
< GENERATION DU SEUIL :
<
LAI K
LB NSL < (A,B)=NOMBRE DE Q-SECTEURS LIBRES ; A
< NOTER QU'ON FAIT CELA HORS DE LA
< PHASE CRITIQUE, CE QUI N'EST PAS
< TRES IMPORTANT, CAR LE SEUIL N'A
< PAS BESOIN D'ETRE TRES PRECIS...
DV VAR+SEULDV < (A)=NOMBRE MOYEN DE Q-SECTEURS LIBRES
< PAR 'GB' DIVISE PAR 2...
SB ARGDEM+CODEM < ON LUI RETRANCHE LE NOMBRE DE Q-SECTEURS
< PRESENTEMENT DEMANDE, AFIN D'EVITER LES
< EPARPILLEMENTS AU NIVEAU DES GRANDS
< ITEMS...
SARD NBITMO < PREPARATION DU DIVIDENDE DANS (A,B) :
DV VAR+SEULCP
MP VAR+SEULCP < LE SEUIL EST CALCULE EN MULTIPLE INFE-
< RIEUR DE 'SEULCP'...
JANE E80X2 < GLUPSSS, LE SEUIL NE TIENT PAS DANS
< UN MOT !!!
CPZR B < VALIDATION...
JGE E80X1 < OK...
E80X2: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< COMPRENDRE COMMENT LE SEUIL
< PEUT ETRE NEGATIF OU NE PAS
< TENIR SUR UN MOT !!!
<
LBI SEULIN < ON FORCE UN SEUIL PLANCHER...
E80X1: EQU $
STB VAR+SEULSB < ET ON MEMORISE CE SEUIL...
<
< PREPARATION DES ARGUMENTS :
<
LX ARGDEM+CODEM < (X)=NOMBRE D'UNITES A ALLOUER.
PSR W < SAVE L'ADRESSE DE LA DEMANDE.
LA ARGDEM+AMDEM < RECUPERATION DE L'ADRESSE MOT DE
< LA LISTE DES SECTEURS,
LR A,W < (W)=ADRESSE-MOT DE LA ZONE OU STOCKER
< L'ADRESSE DES SECTEURS ALLOUES.
LRM Y
WORD PQSHS < (Y)=ADRESSE DE LA PILE "HS"...
<
< TEST SUR LE POOL GENERAL DES SECTEURS :
<
E80: EQU $
DC NSL < ET UN DE MOINS DANS LE POOL GENERAL.
JNE E81 < C'EST BON, AU MOINS UN EST LIBRE...
<
< CAS OU IL N'Y A PLUS AUCUN SECTEUR LIBRE :
<
E80XX: EQU $ < BRANCHEMENT SUITE A DES 'SYSERS'.
BSR ASYSER < A V E R T I S S E M E N T !!!
WAIT SGETS < L'ALLOCATEUR SE MET EN ATTENTE
< D'UN RELEASE...
<
< CAS OU AU MOINS 1 SECTEUR EST LIBRE :
<
E81: EQU $
PSR X < SAVE NBRE DE SECTEURS A ALLOER.
RQST &ASPHEX <<<XWOR%1+IJIJDX < EST-CE LE 'GB' DU SECTEUR 'INFINI' ??
JNE E96 < NON, VERS LA REPRISE DE L'ALLOCATION...
PSR X < OUI, ON L'OCCUPE...
LXI YY7
LA &ATOGB
XWOR%2: VAL Q8000=K
RBT NBITMO-B-XWOR%2 < AINSI, IL N'EST PLUS ALLOUABLE...
STA &ATOGB
PLR X
DC &ANSLGB < ET UN SECTEUR DE MOINS DANS LE 'GB',
DC NSL < ET DANS LE POOL GENERAL AUSSI...
JMP E96 < VERS LA REPRISE DE L'ALLOCATION...
PAGE
<
<
< D C T R E L E A S E U R D I S Q U E :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
DCTREL: EQU $
PSTREL: WORD K;K;K;K;COM+DEPCS;DCTREL;NIL;PILREL;HANDLR;SMST;SO;SE
#@ASCI " REL" < #SISP CMS5 ASCI#
WORD XIOID0 < IOID.
WORD NFILTR
WORD FILTRS < S-FILTRE.
WORD XTALOC < ETALOC.
WORD XXLOC0 < SEMLOC.
DZS LSEM
WORD NIL < TETE DE LA FILE D'ATTENTE DES
< DEMANDES DE RELEASE SECTEURS.
WORD NIL < QUEUE DE LA FILE D'ATTENTE DES RELEASES.
WORD XXCHV0 < SCHVID.
DZS LSEM
WORD XXSIT0 < SIT (INUTILISE).
DZS LSEM
WORD SPHEX0 < SPHEX.
DZS LSEM
WORD HDLREL < HANDLER DE RELEASE DE L'ESPACE DISQUE.
WORD NIL < PAS DE 'RIT' EVIDEMMENT...
WORD K;K < ETAT.
WORD XBITS0 < BITSEM.
WORD XXNTRY;TRYVID < NTRIES ET FRTRY.
WORD K < HSTATS.
WORD XTESTO < TESTO.
WORD XXDCTF < 'DCT' NON CONNECTABLE...
WORD NOSOSE < DCTFUP ("ALTITUDES" DES FONCTIONS).
< NOTA : IL FAUT RESTER DANS LA PAGE 0 !!!
<
<
< Z O N E V A R I A B L E :
<
<
VARREL: EQU $
IF VARREL-DCTREL-DCTFIX,,XEIF%,
IF ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%: VAL ENDIF
<
< OPTIMISATION DES PARCOURS :
<
WORD SB1
RELSB1:: VAL $-D-VARREL < ACCES AU MOT 'SB1'.
IF RELSB1-GETSB1,,XEIF%,
IF ATTENTION : A CAUSE DE 'ROGB' CES 2
IF DEPLACEMENTS DOIVENT ETRE EGAUX !!!
XEIF%: VAL ENDIF
<
< DEMANDE D'ECHANGE DE 'TOGB' SUR 'DKA' :
<
BYTE NSPDKA;XDSYM < NSPTYP.
XWK:: VAL $-D-VARREL
IF XWK-EGBGR,,XEIF%,
IF ATTENTION : CETTE DEMANDE DOIT ETRE IMPLANTEE
IF RELATIVEMENT A 'DCTREL' DE MEME MANIERE QUE
IF DANS 'DCTGET' !!!
XEIF%: VAL ENDIF
EGBGR: VAL $-D-VARREL
WORD FGR < (OPDEM)=0 : LECTURE,
< =2 : ECRITURE.
WORD TOGB+IJIJDX-ZERO*NOCMO < AMDEM.
WORD YY8 < CODEM.
WORD NILS < ASDEM.
DZS LDEM0+VARREL-$+EGBGR
<
< DEMANDE POUR TESTER LE BON ETAT D'UN Q-SECTEUR :
<
BYTE NSPDKM;XDSYM?XTYPAD
DEMHS:: VAL $-D-VARREL
WORD FGR < ON VA ESSAYER DE LE LIRE...
WORD BUFHS-ZERO
WORD LBUFHS*NOCMO < ET ON LIT LE MINIMUM DE MOTS...
WORD NILS < ADRESSE DU Q-SECTEUR A LIRE.
SECTHS:: VAL $-D-VARREL < ADRESSE DU Q-SECTEUR COURANT A TESTER.
DZS LDEM0+VARREL-$+DEMHS
WORD KQSHS < NOMBRE DE Q-SECTEURS HORS-SERVICE ; CE
< MOT FAIT PARTIE DE LA 'COPY' DU SYSTEME.
NQSHSR:: VAL $-D-VARREL < COMPTEUR DES Q-SECTEURS MAUVAIS...
<
<
< P I L E :
<
<
CALL #SISP CMS5 DOL2#
PILREL: EQU $-DEPILE
XWPILE: VAL LPILEH+15
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< H A N D L E R D E R E L E A S E D I S Q U E :
<
<
< ARGUMENTS :
< (L)=ADRESSE DE LA 'DCT' DE RELEASE,
< (W)=ADRESSE DE LA DEMANDE DE RELEASE (LES
< ARGUMENTS ONT LA MEME SIGNIFICATION
< QUE POUR 'HDLGET' MAIS DANS LE SENS
< INVERSE...).
<
<
USE L,DCT0
USE W,DEM0
HDLREL: EQU $
LX ARGDEM+CODEM < (X)=NOMBRE DE SECTEURS A RELEASER,
PSR W < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE,
LA ARGDEM+AMDEM
LR A,W < (W)=ADRESSE DE LA LISTE DES SECTEURS A
< RELEASER.
LRM Y
WORD PQSHS < (Y)=ADRESSE DE LA PILE 'PQSHS'.
<
< ACCES AU 1ER SECTEUR A LIBERER :
<
E90: EQU $
LA O,W < (A)=ADRESSE DU SECTEUR COURANT A RENDRE,
CP INFINI < ALORS, ON N'A PAS CONFIANCE ???
JNE E90XYZ < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< OU BIEN C'EST UNE ANCIENNE
< VERSION DE L'ALLOCATION QUI
< A ALLOUE LE SECTEUR 'INFINI'
< PAR ERREUR, SINON, IDENTIFIER
< LE DEMANDEUR, ET VOIR POUR-
< QUOI IL REND L'INDICATEUR DE
< FIN DE CHAINAGE !!!
<
JMP E93XXX < ET ON IGNORE CE SECTEUR...
E90XYZ: EQU $
STA VAR+SECTHS < A PRIORI ON VA TESTER LE Q-SECTEUR ('A').
XWOR%1: VAL DKMINX=K
XWOR%1: VAL -XWOR%1
SLRS -XWOR%1
CPI DKMINX>XWOR%1 < EST-CE UN SECTEUR INEXISTANT ???
< (VOIR LA COMPRESSION DU 'SGN')
JNE E93XXY < NON, UN VRAI, ON LE REND...
<
< CAS DES SECTEURS INEXISTANTS :
<
LR W,B < SAUVEGARDE DANS 'B' DE L'ADRESSE DES
< SECTEURS A RELEASER.
PLR W < RESTAURE : (W)=ADRESSE DE LA DEMANDE,
PSR W < ET RESAUVEGARDE IMMEDIATE...
LA ARGDEM+ETADEM < (A)=DEMANDEUR DU RELEASE,
CPI NSPDLN < EST-CE BIEN LE DELETE DU 'SGN' ???
LR B,W < ET RESTAURE : (W)=ADRESSE DE LA LISTE
< DES SECTEURS A RELEASER...
JE E93XXX < OK, C'EST LE 'SGN', ON NE REND PAS
< CE SECTEUR BIEN ENTENDU...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ALLER VOIR LE DEMANDEUR...
<
JMP E93XXX < ET ON NE REND RIEN BIEN SUR...
<
< CAS DES SECTEURS REELS :
<
E93XXY: EQU $
LA VAR+SECTHS < NON, ON RESTAURE 'A'...
PSR X < SAUVEGARDE DU NOMBRE DE SECTEURS ENCORE
< A RENDRE.
RQST &ASPHEX <<<XWOR%1-N < DANS 'A' LE NUMERO DU SECTEUR
< DANS LE 'SB'.
ADRI -YY7,B < DEVIRTUALISATION DU NUMERO
< DE 'SB'.
NGR B,B < (B)=NUMERO DE 'SB'.
XR A,B < (A)=NUMERO DE 'SB',
< (B)=NUMERO DE SECTEUR.
CP &VAR+RELSB1 < REGARDONS SI LE SECTEUR RELEASE
< EST DANS L'INTERVALLE (1,(SB1)) ???
JLE E99 < OUI, C'EST BON.
STA &VAR+RELSB1 < SI NON, LE 'SB' AUQUEL APPARTIENT
< LE SECTEUR RELEASE DEVIENT LA
< BORNE SUPERIEURE SB1 DE PARCOURS
< DE LA TOGB COURANTE.
E99: EQU $
LR A,X < (X)=NUMERO DE 'SB'.
LA &ATOGB < ACCES A LA TABLE D'OCCUPATION
< DU 'SB' DU SECTEUR RELEASE.
XR B,X < (X)=NUMERO DU SECTEUR.
TBT L,X < TEST DE L'ETAT DU SECTEUR...
JNC SYSRBQ < OK.
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ETRE TRES PRUDENT SI ON RELANCE
< LE SYSTEME...
<
SYSRBQ: EQU $
SBT L,X < RELEASE DU SECTEUR.
XR B,X < (X)=NUMERO DU 'SB'.
PSR A,X,W
LA ETASYS
TBT QSHS < FAUT-IL TESTER LES Q-SECTEURS EN
< MAUVAIS ETAT ???
JNC E99XX < NON, RIEN A FAIRE DONC...
<
< TEST DE L'ETAT DU SECTEUR
< COURANT QUE L'ON REND :
<
LAD VAR+DEMHS < OUI, ON VA DONC LIRE UN NOMBRE DE
LR A,W
BSR ACHAND < MOTS SUFFISANTS SUR LE Q-SECTEUR
BSR ACHANW < COURANT POUR QUE LE CHECKSUM DE
< CHACUN DES SECTEURS QUI LE COMPOSENT
< SOIT CALCULE :
JE E99XX < LE SECTEUR COURANT EST BON...
<
< CAS OU UN Q-SECTEUR RENDU EST EN MAUVAIS ETAT :
< (ON NE PEUT LE RELIRE CORRECTEMENT...)
<
LA VAR+SECTHS < (A)=ADRESSE DU Q-SECTEUR "HS" :
PUSH < ON LE MEMORISE,
JNCV E99XY < OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< C'EST PAS GRAVE : RELEVER MANUELLEMENT
< L'AFRESSE DU Q-SECTEUR "HS", PUIS AUGMENTER
< LA TAILLE DE 'PQSHS'...
<
E99XY: EQU $
LX NUGBC < (X)=NUMERO DU 'GB' COURANT,
DC &ANSLGB < ON DECOMPTE LE Q-SECTEUR COURANT,
< CAR IL A DEJA ETE RENDU AU 'GB'...
IC &VAR+NQSHSR < ET ON COMPTE LES MAUVAIS Q-SECTEURS.
LAD &ASPHEX
BSR ARLSE < FIN DE PHASE CRITIQUE GET/REL...
PLR A,X,W
JMP E93 < VERS LE Q-SECTEUR SUIVANT...
<
< CAS OU UN Q-SECTEUR RENDU EST EN BON ETAT :
<
E99XX: EQU $
PLR A,X,W
STA &ATOGB < ET MISE A JOUR DE 'TOGB'...
LAD &ASPHEX
BSR ARLSE
IC NSL < ET UN SECTEUR DE PLUS DANS LE
< POOL GENERAL.
LA NSL < (A)=NOMBRE DE SECTEURS ACTUELLEMENT
< LIBRES :
CPI W < 'HDLGET' ATTEND-IL ???
JNE E93 < ON...
<
< OUI, 'HDLGET' ETAIT BLOQUE, ET
< EN MANQUE (COMME ON DIT...) :
<
ACT SGETS < REVEIL DE L'ALLOCATEUR.
<
< NOTA :
< 'NUGBC' EST OK POUR
< L'ALLOCATEUR 'GET'...
<
E93: EQU $
PLR X < RESTAURE :
< (X)=NOMBRE (+1) DE SECTEURS ENCORE A
< RELEASER.
E93XXX: EQU $ < CAS DES SECTEURS INEXISTANTS...
ADRI P,W < POUR L'ACCES A L'EVENTUEL
< SECTEUR SUIVANT.
JDX E90 < AU SUIVANT...
PLR W < RESTAURE :
< (W)=ADRESSE DE LA DEMANDE...
LA ARGDEM+ETADEM < (A)='NSP' DU DEMANDEUR :
CPI NSPINI < NE SERAIT-CE PAS LA TACHE D'INITIALI-
< SATION ???
JE E93XXT < OUI, DONC PAS DE COPIE, EN EFFET, TANT
< QUE L'INITIALISATION N'EST PAS TERMINEE
< ON NE PEUT FAIRE DE COPIE (VOIR A CE
< PROPOS LE MODULE DE 'COPY' DANS
< 'HDLHOR'...).
SVC SVCM7 < NON, ON DEMANDE UNE COPIE SYNCHRONE SUR
< LA ZONE 'SCOPY1'...
E93XXT: EQU $
RSR < C'EST LA FIN...
<
< CAS OU UN SECTEUR RELEASE N'APPARTIENT PAS AU 'GBC' :
<
E91: EQU $
PSR W < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE
< DE RELEASE.
PSR X < SAUVEGARDE DU NUMERO DU NOUVEAU 'GBC'.
LX NUGBC < ACCES AU 'GBC' PRECEDEMT POUR
< ECRITURE DE SA TOGB SUR DK1.
BSR AWOGB < SAUVEGARDE DE L'ANCIEN 'GBC'...
PLR X < RESTAURE :
< (X)=NUMERO DU NOUVEAU 'GBC',
BSR AROGB < ET LECTURE DE SA 'TOGB'...
STX NUGBC < ET POSITIONNEMENT DU NOUVEAU 'NUGBC'.
PLR W < RESTAURE :
< (W)=ADRESSE DE LA DEMANDE DE RELEASE.
JE E92 < ET C'EST REPARTI...
JMP E93XX < N'AYANT PU LIRE LA 'TOGB', ON IGNORE
< LE Q-SECTEUR RELEASE...
<
<
< N O T A I M P O R T A N T :
< TOUTES LES 'SYSERS' DE L'ALLOCATION/
< RELEASE DISQUE PEUVENT SURVENIR APRES
< UNE MAUVAISE REINITIALISATION DU
< SYSTEME, OU BIEN APRES QU'UNE
< INITIALISATION PIRATE AIT ETE FAITE
< (PROGRAMME ESCLAVE EN MODE MAITRE) ;
< DANS TOUS LES CAS, POUR RELANCER LE SYSTEME,
< IL FAUDRA ETRE PRUDENT, ET PEUT ETRE
< INHIBER LA COPIE ('ETASYS')...
<
<
Copyright (c) Jean-François Colonna, 2011-2013.
Copyright (c) CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2011-2013.