<***********************************************************************
<* *
<* *
<* L I N K - E D I T T R A N S L A T E U R *
<* A U T O T R A N S L A T A B L E L I N K *
<* *
<* CE CHARGEUR CHARGE UN PROGRAMME DANS UNE PARTITION *
<* MINIMUM DE LONGUEUR 'LGINI' (MOINS SA LONGUEUR 'LGCHGM'). *
<* SI LE PROGRAMME EST TROP GROS, IL SE DEPLACE DE 'LGDEPL'. *
<* LE MAXIMUM ACTUEL IMPOSE PAR LE SYSTEME EST DE 8K. *
<* LA VERSION LINK DEMANDE LE NOM DE L'ITEM A GENERER *
<* SI ON NE VEUT PAS DE CETTE OPTION, ENTRER UN NOM VIDE *
<* LA VERSION LKDK CHARGE EN ABSOLU SUR DISQUE *
<* ELLE DEMANDE LE NUMERO DE DISQUE(2 OU 3), *
<* L'ADRESSE DE DEBUT DE CHARGEMENT, L'ADRESSE DE FIN *
<* POUR VERIFICATION, ET UNE ADRESSE DE TRANSLATION *
<* PERMETTANT UN CHARGEMENT DECALE. *
<* LES DEUX VERSIONS DEMANDENT LES NOMS DE FICHIERS A CHARGER *
<* *
<* MESSAGES D'ERREURS : *
<* - 0X : ERREUR SYSTEME OU ASSEMBLEUR *
<* - '01 : ERREUR LORS DE LA LECTURE DU BINAIRE *
<* - 1X : ERREURS DUES A L'ASSEMBLEUR *
<* - '11 : NUMERO DE COMMANDE ERRONNEE *
<* - '12 : COMMANDE ABSOLUE EN TRANSLATABLE *
<* - '13 : ERREUR DE CHECKSUM *
<* - 2X : ERREUR DE PROGRAMMATION *
<* -'21 : ADRESSE GENEREE DANS UNE INSTRUCTION > 32K *
<* - '22 : ADRESSE DE CHARGEMENT > 32K *
<* - '23 : PROGRAMME DEPASSANT LA PARTITION MEMOIRE MAXI *
<* - '24 : ENTRY DEJA DEFINI *
<* - '25 : EXTERN NON DEFINI(S) *
<* - '26 : DEBORDEMENT DE LA TABLE DE REFERENCES *
<* - 3X : ERREUR CHARGEMENT DISQUE *
<* -'31 : DEPASSEMENT @ FIN CHARGEMENT *
<* *
<* *
<***********************************************************************
PAGE
IDP "LINK - RELEASE 07/11/78"
IF ORDI-"S",XWOR%,,XWOR%
QUANTA: VAL 3 < QUANTA INDIQUE LE NOMBRE
< DE SECTEURS PHYSIQUES DANS UN
< SECTEUR LOGIQUE
IDP "VERSION SOLAR"
XWOR%: VAL 0
IF ORDI-"T",XWOR%,,XWOR%
QUANTA: VAL 1 < QUANTA INDIQUE LE NOMBRE DE
< SECTEURS PHYSIQUES DANS UN
< SECTEUR LOGIQUE
IDP "VERSION T1600"
XWOR%: VAL 0
IDP "SERGE SOUZEAU"
PAGE
<***********************************************************************
<* *
<* RESERVATION DE PLACE POUR LE PROGRAMME A CHARGER. *
<* *
<***********************************************************************
TABLE
<***********************************************************************
<* *
<* VALEURS IMPORTANTES. *
<* *
<***********************************************************************
LGINI: VAL '800 < LONGUEUR INITIALE PARTITION
LGDEPL: VAL '800 < LONGUEUR DU DEPLACEMENT
LGCHSB: VAL '3D7 < LONGUEUR DU CHARGEUR SANS LE
< BUFFER BINAIRE
LGCHGM: VAL 128*QUANTA+LGCHSB < LONGUEUR REELLE DU CHARGEUR
SPROG: VAL LGINI-LGCHGM-'15 < PLACE INITIALEMENT LIBRE
<***********************************************************************
<* *
<* INTERFACE AVEC CMS4. *
<* *
<***********************************************************************
ZERO: EQU $ < ZERO TRANSLATABLE DU PROGRAMME
DZS 'C
DITEM: EQU $
ASCI "LINK"
BYTE '04;'D0
DBCHIT: EQU $
WORD SIZE
WORD PLOAD
<***********************************************************************
<* *
<* ENTREE DANS LE PROCESSEUR. *
<* *
<***********************************************************************
WORD LOAD
PROG
PLOAD: EQU $
LRP L
BR -1,L
<***********************************************************************
<* *
<* ZONE RESERVEE POUR CHARGER LE PROGRAMME. *
<* *
<***********************************************************************
DZS SPROG
TOUDEB: EQU $
BUFBIN: DZS 128*QUANTA < BUFFER D'ENTREE DU BINAIRE
BUFREF: DZS 128 < BUFFER POUR LES REFERENCES
PAGE
<***********************************************************************
<* *
<* COMMON. *
<* *
<***********************************************************************
COMMON
COM: EQU $
BUFFER: DZS 40 < BUFFER D'ECRITURE DES MESSAGES
INDEX: WORD 128*QUANTA-1/3*3*2 < INDEX DU BUFFER BINAIRE.
NBREF: WORD 0 < NB DE REFERENCES
XBUFRF: WORD -128 < PT SUR LE BUFFER DES REFERENCES
NORFCP: DZS 1 < COMPTAGE DES REFERENCES EXISTANTES
ECRREF: WORD '0C02 < ECRITURE REFERENCES EN SCRATCH
WORD BUFREF-ZERO*2
WORD 256
WORD 0
LECREF: WORD '0C00 < LECTURE
WORD BUFREF-ZERO*2
WORD 256
WORD 0
KSTORE: DZS 20 < PILE POUR K
CHKSUM: DZS 1 < CHECKSUM
ABSMOD: WORD -1 < INDICATEUR TRANSLATABLE-ABSOLU
ADSTOC: DZS 2 < QUADRUPLET 'AU FRAIS'
PAFINI: DZS 1 < RELAI POUR SUITE DE COMMANDE
FINMOD: DZS 1 < INDICATEUR DE FIN DE MODULE
CPTLOD: DZS 1 < COMPTEUR DE REPEAT LOAD
OPNBO: WORD '0305 < OPEN-OLD ENREGISTREMENT
WORD 1 < CLE=1.0
WORD 0
CCI: WORD 1 < RETOUR AU CCI SI ERREUR
IOCBIN: WORD '0308 < LECTURE MODE SAVE
WORD BUFBIN-ZERO*2
WORD QUANTA*128*2
IOCBL: WORD '0202 < SORTIE LISTING
WORD BUFFER-ZERO*2
WORD 0
<***********************************************************************
<* *
<* ZONE COMPRENANT DES ADRESSES RELATIVES A INCREMENTER *
<* LORS DE LA TRANSLATION DU CHARGEUR. *
<* ACCMOD DOIT TOUJOURS ETRE LE DERNIER. *
<* *
<***********************************************************************
ADEBCM: EQU $ < DEBUT ZONE A TRANSLATER
MAXMEM: WORD TOUDEB < LIMITE DU PROGRAMME
ADLANC: WORD DEBPG < DEBUT DU PROGRAMME CHARGE
RELBUF: WORD BUFBIN+1,X < RELAI BUFFER BINAIRE BIT INDEX
ABUFB: WORD BUFBIN
ABUFRF: WORD BUFREF+128,X
SORMES: WORD ENTMOT < SP DE SORTIE QUESTIONS
MERCLF: WORD MSGRC < SP DE SORTIE DE CR-LF
MESER: WORD MSGERR < SP DE SORTIE D'ERREURS
BANDEF: WORD FINBAN
LITQ: WORD SPLITQ < SP DE LECTURE 1 QUADRUPLET
AUFRAI: WORD ADSTOC+2,X < QUADRUPLET 'AU FRAIS'
TABCDE: WORD TABAIG,X < AIGUILLAGE SUIVANT COMMANDE
TABAIG: WORD DEBUT < CHARGER EN
WORD SUITE < CHARGER A LA SUITE SANS TRANSL.
WORD LANCT < ADRESSE DE LANCEMENT
WORD REPEAT < REPEAT LOAD
WORD CHECK < FIN BANDE ET CHECKSUM
WORD COMENT < COMMENTAIRE
WORD PACDE < SUITE DE COMMANDE
WORD TRANSL < CHARGER A LA SUITE EN TRANS.
WORD REMADR < REMONTER CHAINE ADRESSES
WORD DEPADR < DEPLACEMENT SUR ADRESSE
WORD LECTUR < DEBUT DE PST
WORD NSECT < NOM DE SECTION
WORD ENT < ENTRY
WORD REMJMP < DEF. DE REF. AVANT RELATIVE
TRANSB: WORD BTRANS < SP DE TRANSLATION DE B
RANGB: WORD VERIFW < SP RANGE B EN VERIFIANT ADRESSE
NEWCHG: WORD AUTMOD < RELANCE DU MODULE
AREMA2: WORD REMAD2 < SUITE DE COMMANDE CHAINE
ADEPA2: WORD DEPAD2 < SUITE DE COMMANDE DEPLACEMENT
ADRFAT: WORD RFATAL < TRAITEMENT ERREUR FATALE
ADLECT: WORD LECTUR < LECTURE DE QUADRUPLETS
AREXT1: WORD REXT1 < SUITE DE COMMANDE EXT
AREXT2: WORD REXT2
AREXT3: WORD REXT3
ASECT1: WORD SECT1 < SUITE DE COMMANDE SECTION
ASECT2: WORD SECT2
ARENT1: WORD RENT1
ARENT2: WORD RENT2
ARENT3: WORD RENT3
ARJMP2: WORD REMJM2 < SUITE DE COM. REF. AVANT REL.
CHAINE: WORD SPCHAI < SP DE REMONTEE D'UNE CHAINE D'@
CHREF: WORD SPCHRF < SP DE RECHERCHE DE REFERENCE
PLNOM: WORD SPLNOM < SP DE PLACEMENT NOM REFERENCE
SORCAR: WORD PRECAR < SORTIE DE 3 CARACTERES
SORC6: WORD SORTI6 < SORTIE DE 6 CARACTERES
SORADR: WORD ECRADR < SORTIE ADRESSE
SORHEX: WORD BUFFER+3,X < POUR ADRESSE RELATIVE
AZERCH: WORD ZEROCH < ADRESSE DE MISE A ZERO CHARGEUR
ADDEBX: WORD TOUDEB,X < DEBUT DE MISE A ZERO
AFINZ: WORD FINZER < FIN DE MISE A ZERO DU CHARGEUR
ACCMOD: WORD AFINCM,X < FIN DE MODIFICATION
< LORS DU DEPLACEMENT DU CHARGEUR
AFINCM: EQU $ < FIN DE ZONE A TRANSLATER
<***********************************************************************
<* *
<* FIN DE ZONE D'ADRESSES A TRANSLATER. *
<* *
<***********************************************************************
ADDEB: WORD TOUDEB < DEBUT DU CHARGEUR
NBCMOD: VAL AFINCM-ADEBCM < NB D'ADRESSES A MODIFIER
DEUXK: WORD LGDEPL < LONGUEUR DU DEPLACEMENT
QUATK: WORD LGDEPL*2 < DOUBLE DEPLACEMENT
DEBCHG: VAL TOUDEB-ZERO
LGLOAD: WORD LGINI-DEBCHG-16 < LONGUEUR DU CHARGEUR
LGZERO: DZS 1 < LONGUEUR A METTRE A ZERO
ADINIT: DZS 1 < DEBUT CHARGEMENT D'UN MODULE
LGPART: WORD LGINI < LONGUEUR DE LA PARTITION
ALLOC: WORD '0004 < RESERVATION INITIALE
WORD 0
WORD LGINI*2
RCLF: WORD '0D0A < CR-LF
ERREUR: ASCI "ERU " < MESSAGE D'ERREUR
START: ASCI "RUN " < MESSAGE RUN
TRENTE: WORD '3030
NB7FFF: WORD '7FFF
BLQ: ASCI " '"
DNMF: BYTE '6D;"F" < DEMANDE DU NOM DE FICHIER
ASCI "ICH="
DEMNMF: WORD '0202
WORD DNMF-ZERO*2
WORD 6
ASSO: ASCI "!ASSIGN 3=O,"
NMFC: DZS 20 < NOM DU FICHIER
DEMASS: WORD '0002
WORD ASSO-ZERO*2
WORD 80
LECNMF: WORD '0101 < LECTURE DU NOM
WORD NMFC-ZERO*2
WORD 40
MCLOS: ASCI "!ASSIGN 3=" < !ASSIGN 3=S
BYTE "S";'04
DEMCLO: WORD '0002 < DEMANDE DE "!CLOSE"
WORD MCLOS-ZERO*2
WORD 80
DNOM: BYTE '6D;"N" < DEMANDE DU NOM DE L'ITEM
ASCI "OM ="
DEMNOM: WORD '0202
WORD DNOM-ZERO*2
WORD 6
LECNOM: WORD '0101 < LECTURE DU NOM DE L'ITEM
WORD ZERO
WORD 28
DEBITE: DZS 1 < DEBUT DE L'ITEM
ADZER: WORD ZERO,X < @ ZERO INDEXEE
DEMGEN: WORD '0002 < DEMANDE AU SGN
DZS 3
PAGE
<***********************************************************************
<* *
<* C H A R G E U R . *
<* *
<* INITIALISATION DU CHARGEUR. *
<* *
<***********************************************************************
PROG
WORD COM+'80
LOAD: EQU $
LRP C < INITIALISATION DE LA BASE C
LA -1,C
LR A,C
LAI -1 < RENDRE ALT-MODE INEFFECTIF
WORD '1EB5
LAD KSTORE-1 < INITIALISATION DE K
LR A,K
EORR W < @ DEBUT CHARGEMENT
LA AFINZ < INIT. LGZERO
SB MAXMEM
STA LGZERO
BSR MERCLF < ENVOI DE CRT CHARGEMENT
LAD DEMCLO < !CLOSE
SVC 0
BR BANDEF
<***********************************************************************
<* *
<* OUVERTURE DU FICHIER CONTENANT LE MODULE A CHARGER. *
<* *
<***********************************************************************
AUTMOD: EQU $
LAD DEMASS < ASSIGN
SVC 0
LAD OPNBO < OUVERTURE DU FICHIER BINAIRE
SVC 0 < DANS LE MODE OPEN-OLD-ENREGIS-
< TREMENT
JE RELANS < GO ON SI OPEN OK
<***********************************************************************
<* *
<* SORTIE EN ERREUR DU LOAD. *
<* *
<***********************************************************************
HORTEN: EQU $
LAD CCI < RETOUR AU CCI
SVC 0
JMP $-1
<***********************************************************************
<* *
<* ERREUR FATALE. *
<* *
<***********************************************************************
RFATAL: EQU $
XR A,K < REINITIALISATION DE K
LAD KSTORE-1
XR A,K
BSR MESER < SORTIE DU MESSAGE D'ERREUR
JMP HORTEN
PAGE
<***********************************************************************
<* *
<* DEBUT DU CHARGEMENT. *
<* COMMANDE 'A3 POUR TRANSLATABLE, *
<* SINON, C'EST EN ABSOLU. *
<* *
<***********************************************************************
RELANS: EQU $
BSR LITQ < LECTURE 1ER QUADRUPLET
CPI 'A3 < MODULE TRANSLATABLE ?
JNE ANALIZ < SI ABSOLU, ABSMOD=-1
IC ABSMOD < SI TRANSLATABLE, ABSMOD=0
<***********************************************************************
<* *
<* LECTURE DES QUADRUPLETS ET ANALYSE D'UNE COMMANDE. *
<* *
<***********************************************************************
LECTUR: EQU $
BSR LITQ < LECTURE D'UN QUADRUPLET
ANALIZ: EQU $
ANDI 3 < COMMANDE ABSOLU OU TRANSLATABLE
JAE ABSOL
CPI 2 < COMMANDE TRANSLATABLE
JNE VOIEXT
CPZ ABSMOD
JL PATRAN
LBY ADSTOC < NUMERO DE LA COMMANDE
ANDI '1C
ADRI '18,A
NUMCDE: EQU $ < AIGUILLAGE SUIVANT COMMANDE
SLRS 2
LR A,X
BR &TABCDE
ABSOL: EQU $ < COMMANDE ABSOLUE
LBY ADSTOC
ANDI '1C
CPI '14
JLE NUMCDE
ERCMDE: EQU $ < NUMERO COMMANDE ERRONNE
LAI '11
BR ADRFAT
PATRAN: EQU $ < COMMANDE ABSOLUE EN TRANSLATAB.
LAI '12
BR ADRFAT
VOIEXT: EQU $
LBY ADSTOC
CPI 'A5 < EXT
JNE ERCMDE
PAGE
<***********************************************************************
<* *
<* 'A5 - EXT *
<* *
<***********************************************************************
STB BUFFER < PLACER 2 PREMIER CARAC. DU NOM
LA AREXT1 < ATTENDRE LA SUITE
STA PAFINI
JMP LECTUR
REXT1: EQU $ < SUITE
STB BUFFER+1 < 2 CARAC. SUIVANTS
LA AREXT2 < ATTENDRE LA SUITE
STA PAFINI
JMP LECTUR
REXT2: EQU $ < SUITE
STB BUFFER+2 < 2 DERNIER CARAC.
LA AREXT3 < ATTENDRE LA SUITE
STA PAFINI
JMP LECTUR
REXT3: EQU $ < FIN
BSR TRANSB < @ RELATIVE DEBUT PARTITION
BSR CHREF < CHERCHER LE REFERENCE
JANE EXTABS
PSR W < ELLE EXISTE
LR B,W < SAUVER VALEUR EXT
LA &ABUFRF < VALEUR REF.
JAL DEJEXT
LR A,B < DEFINI ENT
BSR CHAINE < PLACER VALEUR DANS CHAINE
RETEXT: EQU $
PLR W
JMP LECTUR
DEJEXT: EQU $
LA 0,W
RBT 0 < REMONTER LA CHAINE ACTUELLE
CP NB7FFF < POUR LA CHAINER AVEC LA PRECEDENTE
JE EXT10
LR A,W
JMP DEJEXT
EXT10: EQU $
LA &ABUFRF
RBT 0
SBT 16
STB &ABUFRF
LR A,B
LA 0,W
JAGE $+2 < INDEXATION
SBT 16
STB 0,W
LAD ECRREF
SVC 0
JMP RETEXT
EXTABS: EQU $
BSR PLNOM < ABSENT - LA PLACER
SBT 16
STB &ABUFRF
ADRI 1,X
STX XBUFRF
LAD ECRREF
SVC 0
IC NBREF
JMP LECTUR
PAGE
<***********************************************************************
<* *
<* 'A0 - CHARGER EN. *
<* POSITIONNER W. *
<* *
<***********************************************************************
DEBUT: EQU $
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
LR B,W
JMP LECTUR
PAGE
<***********************************************************************
<* *
<* '24 - CHARGER A LA SUITE SANS TRANSLATER. *
<* RANGER A LA SUITE EN TENANT COMPTE DU REPEAT LOAD. *
<* *
<***********************************************************************
SUITE: EQU $
BSR RANGB < RANGEMENT DE L'INFORMATION
ADRI 1,W
DC CPTLOD < REPEAT LOAD?
JG SUITE
STZ CPTLOD < REMISE A ZERO DU REPEAT LOAD
JMP LECTUR
PAGE
<***********************************************************************
<* *
<* '28 - ADRESSE DE LANCEMENT. *
<* RELEVER L'ADRESSE. *
<* *
<***********************************************************************
LANCT: EQU $
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
STB &ADLANC
IC FINMOD < FIN DE MODULE=1
JMP LECTUR
PAGE
<***********************************************************************
<* *
<* 'AC - REPEAT LOAD. *
<* POSITIONNER LE COMPTEUR. *
<* *
<***********************************************************************
REPEAT: EQU $
STB CPTLOD
BR ADLECT
PAGE
<***********************************************************************
<* *
<* '30 - CHECKSUM ET FIN DE BANDE. *
<* VERIFICATION DU CHECKSUM ET FIN DE CHARGEMENT. *
<* *
<***********************************************************************
CHECK: EQU $
LA CHKSUM < VERIFICATION
CPR B,A
JE BONSUM
LAI '13 < ERREUR DANS LE CHECKSUM
BR ADRFAT
BONSUM: EQU $
LA OPNBO < MISE EN MODE CLOSE-SAVE DE LE
LR A,Y < SAUVER L'ETAT ACTUEL
ORI 2 < DEMANDE 'OPNBO'
STA OPNBO
LAD OPNBO < FERMETURE EN SAVE DE
SVC 0 < L'ENREGISTREMENT
STY OPNBO < RESTAURER L'ETAT INITIAL
LAD DEMCLO < !CLOSE
SVC 0
CPZ FINMOD < FIN DE MODULE?
JE FINBAN < FIN DE BANDE UNIQUEMENT
LA &ADLANC
JAL FINBAN < FIN DE MODULE SANS LANCEMENT
FINTOU: EQU $
<
< DEMANDE DU NOM DE L'ITEM
<
LAI -1 < ABSENT A PRIORI
STA DEBITE
LAD DEMNOM
SVC 0
LAD LECNOM
SVC 0
WORD '1E35 < LONGUEUR
LR B,Y
ADRI -1,B < NOM ABSENT?
CPZR B
JLE PANOM
LR Y,A < PRESENT - LE PLACER
SLRS 1
LR A,X
NGR A
ADRI 'E,A
STA DEBITE < @ NOM
LR A,B
ADR A,Y < @ FIN
ADR A,Y
LAI 0
MOVE
LAI '04 < PLACER UN EOT
LR Y,X
ADRI -1,X
STBY &ADZER
LR B,X < REMISE A ZERO DEBUT
REZER: EQU $
ADRI -1,X
CPZR X
JL PLUZER
STZ &ADZER
JMP REZER
PLUZER: EQU $
CPZ &ADLANC < @ LANCEMENT PRESENTE?
JGE ADPRES
LXI '10 < NON - LA GENERER
LA &ADZER
STA &ADLANC
ADPRES: EQU $
LR W,A < CALCUL TAILLE
ADRI -'F,A
SLLS 1
LXI 'F
STA &ADZER
LA DEBITE < @ DEBUT NOM
SLLS 1
STA DEMGEN+1
LR W,A < LG TOTALE
SB DEBITE
SLLS 1
STA DEMGEN+2
LAI 'F < DEPLACEMENT
SB DEBITE
SLLS 1
STA DEMGEN+3
LAI '83 < SUPPRESSION DE L'ITEM
STBY DEMGEN
LAD DEMGEN
SVC 0
LAI '84 < CREATION
STBY DEMGEN
LAD DEMGEN
SVC 0
PANOM: EQU $
LAD START < IMPRESSION ADRESSE LANCEMENT
BSR SORMES
LA &ADLANC
BSR SORADR
<
< IMPRESSION TABLE LIENS ET EXTERNES NON DEFINIS
<
LXI 0 < PT SUR BUFFER
STZ LECREF+3 < PREMIER SECTEUR
DC LECREF+3
EORR L < CPTE D'ERREURS
REREXT: EQU $
CPZ NBREF < Y-EN-A-T'IL ENCORE?
JLE FEREXT
CPZR X < DOIT-ON RELIRE?
JL ENCEXT
IC LECREF+3
LAD LECREF
SVC 0
LXI -128
ENCEXT: EQU $
LR X,Y < IMPRESSION NOM
BSR MERCLF
LR Y,X
LAD BUFFER
LR A,B
LAD &ABUFRF
LXI 3
MOVE
BSR SORC6
LR Y,X
ADRI 3,X < ERREUR SI EXT NON DEFINI
LA &ABUFRF
JAGE PAERXT
ADRI 1,L
LAI -1
PAERXT: EQU $
BSR SORADR < IMPRESSION @
LR Y,X
ADRI 4,X < AUTRE REFERENCE
DC NBREF
JMP REREXT
FEREXT: EQU $
CPZR L < ERREURS?
JE PASRXT
LAI '25
BR ADRFAT
PASRXT: EQU $
BR AZERCH < REMETTRE LE CHARGEUR A ZERO
<***********************************************************************
<* *
<* FIN DE BANDE - RETOUR AU MONITEUR. *
<* *
<***********************************************************************
FINBAN: EQU $
LR W,A < DEBUT MODULE SUIVANT
STA ADINIT
RENMFC: EQU $
LAD DEMNMF < NOM DU FICHIER
SVC 0
LAD LECNMF
SVC 0
WORD '1E35 < NOM VIDE?
ADRI -1,B
CPZR B
JLE FINTOU < OUI - FIN DE CHARGEMENT
STZ CHKSUM < REINITIALISER LES VALEURS DE
IF ORDI-"S",XWOR%,,XWOR%
LRM A
WORD 128*QUANTA-1/3*3*2
XWOR%: VAL 0
IF ORDI-"T",XWOR%,,XWOR%
LAI 126
ADR A,A
XWOR%: VAL 0
STA INDEX
LAI -1
STA ABSMOD
STZ FINMOD
STZ CPTLOD
BR NEWCHG < TRAITER LE MODULE SUIVANT
PAGE
<***********************************************************************
<* *
<* 'B4 - COMMENTAIRE. *
<* L'ECRIRE. *
<* *
<***********************************************************************
COMENT: EQU $
BSR SORCAR
BR ADLECT
PAGE
<***********************************************************************
<* *
<* '22 - SUITE DE COMMANDE. *
<* SE REBRANCHER A LA COMMANDE CONCERNEE. *
<* *
<***********************************************************************
PACDE: EQU $
BR PAFINI
PAGE
<***********************************************************************
<* *
<* 'A6 - CHARGER A LA SUITE EN TRANSLATANT. *
<* TRANSLATER ET ALLER CHARGER. *
<* *
<***********************************************************************
TRANSL: EQU $
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
BR TABAIG+1
PAGE
<***********************************************************************
<* *
<* 'AA - REMONTER UNE CHAINE D'ADRESSES. *
<* MEMORISATION DE L'ADRESSE DE DEBUT DE CHAINE. *
<* *
<***********************************************************************
REMADR: EQU $
PSR W < PROTEGER W
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
LR B,W < MEMORISER L'ADRESSE
LA AREMA2 < PREPARER LA SUITE DE COMMANDE
STAPAF: EQU $
STA PAFINI
BR ADLECT
<***********************************************************************
<* *
<* SUITE DE COMMANDE CHAINE. *
<* REMONTER LA CHAINE POUR Y PLACER LA VALEUR. *
<* *
<***********************************************************************
REMAD2: EQU $
BSR TRANSB
BSR CHAINE
JMP PLRW
PAGE
<***********************************************************************
<* *
<* '2E - DEPLACEMENT SUR ADRESSE. *
<* MEMORISATION DE L'ADRESSE. *
<* *
<***********************************************************************
DEPADR: EQU $
PSR W < PROTEGER W
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
LR B,W < PRELEVER L'ADRESSE A MODIFIER
LA ADEPA2 < PREPARER LA SUITE DE COMMANDE
JMP STAPAF
<***********************************************************************
<* *
<* SUITE DE COMMANDE DEPLACEMENT. *
<* MODIFICATION DE LA VALEUR. *
<* *
<***********************************************************************
DEPAD2: EQU $
LA 0,W < PRELEVER L'ADRESSE A MODIFIER
LR A,Y < LA PRESERVER POUR BIT D'INDEX
RBT 0
ADR A,B < MODIFICATION
JNV ADNORM
LAI '21 < ADRESSE GENEREE > 32K
BR ADRFAT
ADNORM: EQU $
CPR Y,A < RESTAURER LE BIT D'INDEX
JE $+2
SBT 16
STB 0,W < RANGER LA VALEUR MODIFIEE
<***********************************************************************
<* *
<* RESTAURER W. *
<* *
<***********************************************************************
PLRW: EQU $
PLR W
BR ADLECT
PAGE
<***********************************************************************
<* *
<* '36 - NOM DE SECTION. *
<* IMPRESSION DU DEBUT DU NOM. *
<* *
<***********************************************************************
NSECT: EQU $
BSR MERCLF < IMPRESSION DE CR-LF
BSR SORCAR < IMPRESSION DES TROIS PREMIERS
< CARACTERES DU NOM
LA ASECT1 < 1ERE SUITE DE NOM
JMP STAPAF
SECT1: EQU $
BSR SORCAR
LA ASECT2 < PREPARER LA SUITE DE NOM
JMP STAPAF
<***********************************************************************
<* *
<* SUITE DE COMMANDE NOM. *
<* IMPRESSION DE LA FIN DE NOM ET DE L'ADRESSE DE DEBUT. *
<* *
<***********************************************************************
SECT2: EQU $
BSR SORCAR < IMPRESSION DE FIN DE NOM
LR W,A < IMPRESSION DE ADRESSE IMPLANTA.
BSR SORADR
BR ADLECT
PAGE
<***********************************************************************
<* *
<* '3A - COMMANDE ENT. *
<* *
<***********************************************************************
ENT: EQU $
STB BUFFER < PLACER 2 CARAC.
LA ARENT1 < SUITE
STA PAFINI
BR ADLECT
RENT1: EQU $
STB BUFFER+1 < PLACER 2 CARAC. A SUIVRE
LA ARENT2
STA PAFINI
BR ADLECT
RENT2: EQU $
STB BUFFER+2 < PLACER FIN NOM
LA ARENT3 < ATTENDRE ADRESSE
STA PAFINI
BR ADLECT
RENT3: EQU $
BSR TRANSB < @ RELATIVE PARTITION
BSR CHREF < RECHERCHE DANS TABLE
JANE ENTABS
LA &ABUFRF < ELLE EXISTE
JAL VUEXT
LY BUFFER < ERREUR - DOUBLE DEFINITION
BSR MERCLF
STY BUFFER
BSR SORC6
LAI '24
BSR MESER
BR ADLECT
VUEXT: EQU $
PSR W < ELLE EXISTE EN EXT
RBT 0 < @ DANS CHAINE
LR A,W
BSR CHAINE
PLR W
STB &ABUFRF < MISE A JOUR TABLE
LAD ECRREF
SVC 0
BR ADLECT
ENTABS: EQU $
BSR PLNOM < ABSENTE- LA PLACER
STB &ABUFRF
ADRI 1,X
STX XBUFRF
LAD ECRREF
SVC 0
IC NBREF
BR ADLECT
PAGE
<***********************************************************************
<* *
<* 'BE - REFERENCE EN AVANT RELATIVE. *
<* PRELEVER LE PREMIER MAILLON. *
<* *
<***********************************************************************
REMJMP: EQU $
PSR W < PROTEGER W
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
LR B,W < RELEVER LE 1ER MAILLON
LA ARJMP2 < PREPARER LA SUITE DE COMMANDE
JMP STAPAF
<***********************************************************************
<* *
<* SUITE DE REFERENCE AVANT RELATIVE. *
<* MODIFICATION SUR LA CHAINE. *
<* *
<***********************************************************************
REMJM2: EQU $
BSR TRANSB < ADRESSE RELATIVE DEBUT PARTITIO
LR B,A < A=REF. EN AVANT
SBR W,A < DIFFERENCE D'ADRESSE
LB 0,W < PRELEVER MAILLON SUIVANT
SCRD 8 < FABRICATION DU MOT DEFINITIF
SWBR B
STB 0,W < RANGEMENT DE LA VALEUR
SWBR A < AD. RELATIVE MAILLON SUIVANT
SBR A,W < AD. ABSOLUE DU MAILLON SUIVANT
JANE REMJM2 < CHAINE FINIE PAR 0
JMP PLRW
PAGE
<***********************************************************************
<* *
<* LECTURE D'UN QUADRUPLET. *
<* *
<***********************************************************************
SPLITQ: EQU $
LYI 0 < POUR SIGNALER 1ER CARACTERE
LXI -4 < NB CARACTERE
PSR B,X,Y < PROTEGER LES REGISTRES DE TRAV.
IF ORDI-"S",XWOR%,,XWOR%
LRM A < DOIT-ON RELIRE ?
WORD 128*QUANTA-1/3*3*2 < INDEX DU BUFFER BINAIRE.
XWOR%: VAL 0
IF ORDI-"T",XWOR%,,XWOR%
LAI 126 < DOIT-ON RELIRE ?
ADR A,A
XWOR%: VAL 0
CP INDEX
JNE PAVID
LAD IOCBIN < LECTURE
SVC 0
JNE NOPAIR < ERREUR DANS LE SGF
STZ INDEX
PAVID: EQU $
LX INDEX < PRELEVER LE BYTE SUIVANT
LBY &RELBUF
IC INDEX
PLR B,X,Y < RESTAURER LES REGISTRES
STBY &AUFRAI
CPZR Y < 1ER CARACTERE(COMMANDE)?
JNE STOCK
ANDI '60 < SI BLANC, RELIRE
CPI '20
JNE SPLITQ+2
ADRI 1,Y < 1ER CARACTERE TROUVE
ADRI 1,X
STOCK: EQU $
JIX SPLITQ+2 < PRELEVER LES 3 AUTRES CARAC.
LBY ADSTOC
CPI '30 < DOIT-ON LE RENTRER DANS CHECKSU
JE PACHEK
LBY ADSTOC < CALCUL CHECKSUM
AD CHKSUM
ADCR A
AD ADSTOC+1
ADCR A
STA CHKSUM
PACHEK: EQU $
LB ADSTOC+1 < A=COMMANDE,B=VALEUR
LBY ADSTOC
RSR
NOPAIR: EQU $ < ERREUR DE PARITE
LAI '01
BR ADRFAT
PAGE
<***********************************************************************
<* *
<* TRANSLATION DE L'ADRESSE CONTENUE DANS B. *
<* *
<***********************************************************************
BTRANS: EQU $
LR B,A
AD ADINIT < TRANSLATION
LR A,B
RSR
PAGE
<***********************************************************************
<* *
<* RANGEMENT DE B AVEC DEPLACEMENT DU CHARGEUR SI NECESSAIRE. *
<* *
<***********************************************************************
VERIFW: EQU $
LR W,A < ADRESSE>32K?
JAGE WNORM
LAI '22
BR ADRFAT
WNORM: EQU $ < ADRESSE DANS LE CHARGEUR?
CP MAXMEM
JGE DEPLAC
STB 0,W < NORMAL. PLACER LA VALEUR
RSR
<***********************************************************************
<* *
<* DEPLACEMENT DU CHARGEUR. *
<* *
<***********************************************************************
DEPLAC: EQU $
PSR B,X,Y < PROTEGER LES REGISTRES DE TRAV.
LA DEUXK < MODIF DE LA TAILLE DE LA DEMAND
SLLS 1
AD ALLOC+2
STA ALLOC+2
LAD ALLOC < DEMANDER 2K
SVC 0
JE PAGOBT
LAI '23 < MEMOIRE NON OBTENUE
BR ADRFAT
PAGOBT: EQU $
LXI -NBCMOD < NB ADRESSES A MODIFIER
< DANS LE COMMON
MODCOM: EQU $
LA &ACCMOD < MODIFICATION
AD DEUXK
STA &ACCMOD
JIX MODCOM
LA QUATK < MODIFIER LES @ DE BYTES
AD IOCBIN+1
STA IOCBIN+1
LA QUATK
AD IOCBL+1
STA IOCBL+1
LA QUATK
AD ECRREF+1
STA ECRREF+1
LA QUATK
AD LECREF+1
STA LECREF+1
LA QUATK
AD DEMCLO+1
STA DEMCLO+1
LA QUATK
AD DEMASS+1
STA DEMASS+1
LA QUATK
AD DEMNMF+1
STA DEMNMF+1
LA QUATK
AD LECNMF+1
STA LECNMF+1
LA QUATK
AD DEMNOM+1
STA DEMNOM+1
LA ADDEB < RECOPIE DU CHARGEUR
AD DEUXK
LR A,B
LA ADDEB
LX LGLOAD
MOVE
LA DEUXK < MODIFIER LES REGISTRES DE BASE
ADR A,K
ADR A,L
ADR A,C
ADRI 1,A
ADRP A < ALLER DANS LE NOUVEAU CHARGEUR
LX DEUXK < MISE A 0 DES 2K LIBERES
NGR X
MEMZER: EQU $
STZ &ADDEBX
JIX MEMZER
LA ADDEB < MODIF. DE ADRESSE DEBUT CHARG.
AD DEUXK
STA ADDEB
PLR B,X,Y < RESTAURER LES REGISTRES
PLR A < MODIFIER ADRESSE DE RETOUR
AD DEUXK
PSR A
JMP VERIFW
PAGE
<***********************************************************************
<* *
<* SP DE REMONTEE D'UNE CHAINE D'@ POUR Y PLACER LA VALEUR *
<* CONTENUE DANS B EN PARTANT A L'ADRESSE CONTENUE DANS W *
<* *
<***********************************************************************
SPCHAI: EQU $
LA 0,W < PRELEVER LE 1ER MAILLON
PSR B < PROTEGER LA VALEUR A PLACER
JAGE BIT00 < PRELEVER SON BIT D'INDEX.
CPZR B < S'IL Y A INDEXATION,LA VALEUR
JGE BIT01 < A PLACER DOIT ETRE INFERIEURE A 32K
LAI '21
BR ADRFAT
BIT01: EQU $
SBT 16
RBT 0
BIT00: EQU $
STB 0,W < PLACER LA VALEUR D'ADRESSE
PLR B < RESTAURER LA VALEUR
CP NB7FFF < FIN DE CHAINE?
JE RETCH
LR A,W < NON - POURSUIVRE
JMP SPCHAI
RETCH: EQU $
RSR
PAGE
<***********************************************************************
<* *
<* SP DE RECHERCHE D'UNE REFERENCE. *
<* *
<***********************************************************************
SPCHRF: EQU $
PSR W
LAI -1 < N0 DE SECTEUR DE RECHERCHE
STA LECREF+3
STZ NORFCP < N0 REFERENCE A COMPARER
LXI 0 < PT DANS SECTEUR RECHERCHE
AUTREF: EQU $
CPZR X < EN RESTE-T-IL DANS LE BUFFER?
JL RFNVID
IC LECREF+3 < NON - SECTEUR SUIVANT
LA LECREF+3
CPI 32
JL OKSEC
LAI '26
BR ADRFAT
OKSEC: EQU $
LAD LECREF
SVC 0
LXI -128
RFNVID: EQU $
LA NORFCP < A-T-ON FINI?
CP NBREF
JGE ABSREF < OUI - ABSENTE
LA BUFFER < EST-CE LE BON?
EOR &ABUFRF
LR A,W
ADRI 1,X
LA BUFFER+1
EOR &ABUFRF
EORR A,W
ADRI 1,X
LA BUFFER+2
EOR &ABUFRF
EORR W,A
ADRI 1,X
JAE REFVUE
ADRI 1,X < NON - SUIVANT
IC NORFCP
JMP AUTREF
REFVUE: EQU $
LAI 0 < TROUVEE
JMP RETREF
ABSREF: EQU $
LAI 1 < ABSENTE
RETREF: EQU $
PLR W
LY LECREF+3
STY ECRREF+3
RSR
PAGE
<***********************************************************************
<* *
<* SP DE PLACEMENT DU NOM D'UNE REFERENCE *
<* *
<***********************************************************************
SPLNOM: EQU $
LX XBUFRF < A-T-ON DE LA PLACE?
CPZR X
JL PLREF
LXI -128
PLREF: EQU $
LA BUFFER
STA &ABUFRF
ADRI 1,X
LA BUFFER+1
STA &ABUFRF
ADRI 1,X
LA BUFFER+2
STA &ABUFRF
ADRI 1,X
RSR
PAGE
<***********************************************************************
<* *
<* IMPRESSION DU CONTENU DE A. *
<* *
<***********************************************************************
ECRADR: EQU $
SLRD 16 < PREPARER LE DECOUPAGE PAR 4 BIT
LXI -4
CARSUI: EQU $
SLLD 4 < ISOLER 4 BITS
ADRI '30,A < CARACTERE IMPRIMABLE
CPI '39
JLE $+2
ADRI 7,A
STBY &SORHEX < MISE DANS LE BUFFER
LAI 0
JIX CARSUI
STZ &SORHEX
LA BLQ < METTRE '
STA BUFFER
JMP SORTI6
<***********************************************************************
<* *
<* SORTIE DE TROIS CARACTERES. *
<* *
<***********************************************************************
PRECAR: EQU $
LA ADSTOC+1 < PLACER 2 CARAC. DANS BUFFER
STA BUFFER
JMP SORTI2
<***********************************************************************
<* *
<* SORTIE D'UN MESSAGE SUIVANT LE NOMBRE DE CARACTERES. *
<* *
<***********************************************************************
SORTI6: EQU $
LXI 6 < 6 CARACTERES
JMP $+2
SORTI2: EQU $
LXI 2 < 2 CARAC.
STX IOCBL+2
LXI 0 < X=0 LOG LISTING
JMP APIOCS
MSGRC: EQU $ < SORTIE DE RC-LF
LXI 2
STX IOCBL+2
LXI 0
JMP RETLF
MSGERR: EQU $ < SORTIE D'UN MESSAGE
LXI 8
STX IOCBL+2
LXI 1 < X=1 ERROR LISTING
SLRD 4 < NUMERO ERREUR
SLLS 4
SLLD 4
AD TRENTE
STA BUFFER+3
LAD ERREUR
JMP INBUF4
ENTMOT: EQU $ < PREPARATION DU MESSAGE
LXI 6
STX IOCBL+2
LXI 0
INBUF4: EQU $
XR A,W
LB 0,W
STB BUFFER+1
LB 1,W
STB BUFFER+2
XR A,W
RETLF: EQU $ < CR-LF
LA RCLF
STA BUFFER
APIOCS: EQU $ < IMPRESSION
LAD IOCBL
SVC 0
RSR
PAGE
<***********************************************************************
<* *
<* MISE A ZERO DU CHARGEUR EN FIN DE TRAITEMENT. *
<* *
<***********************************************************************
ZEROCH: EQU $
LA ADLANC <EMPILER L'ADRESSE DE LANCEMENT
LR A,K
LA ADDEB < MISE A ZERO
LR A,B
ADRI 1,A
LX LGZERO
FINZER: EQU $
STZ &AFINZ
MOVE
LAI '12 < RESTAURER LE ALT-MODE
WORD '1EB5
IF ORDI-"T",XWOR%,,XWOR%
ADRI 1,K < RETOUR AU CCI POUR
LR K,A < DEBUG EVENTUEL
SVC 0
ADRI -1,K
XWOR%: VAL 0
IF ORDI-"S",XWOR%,,XWOR%
WORD '1E16 < RETOUR CCI POUR DEBUG EVENTUEL
XWOR%: VAL 0
RSR < LANCEMENT DU PROGRAMME
DEBPG: WORD 0
IF ORDI-"T",XWOR%,,XWOR%
WORD 1 < RETOUR AU CCI
XWOR%: VAL 0
FITEM: EQU $
LGIT: VAL FITEM-DBCHIT*2
SIZE: EQU ZERO+LGIT
XWOR%1: VAL $-TOUDEB+'10 < LONGUEUR REELLE DU CHARGEUR...
IF LGCHGM-XWOR%1,,XWOR%,XWOR%
IF A T T E N T I O N : LA LONGUEUR ESTIMEE DU
IF DU CHARGEUR EST INSUFFISANTE !!!
XWOR%: VAL 0
PAGE
<***********************************************************************
<* *
<* GENERATION DU CHARGEUR EN TANT QUE ITEM. *
<* *
<***********************************************************************
LOCAL
LONGR: VAL FITEM-DITEM
DEMSGN: WORD '8402 < DEMANDE GENERATION
WORD DITEM-ZERO*2
WORD LONGR*2
WORD 6
PROG
WORD DEMSGN+128
WORD COM+128
GENERE: EQU $
LRP L < INITIALISATIONS DES BASES
LR L,C
LA -2,L
LR A,L
LA -1,C
LR A,C
LAD KSTORE-1
LR A,K
DEM: EQU $
LAD DEMSGN
SVC 0
JE FIN
LAD CCI
SVC 0
JMP DEM
FIN: EQU $
LAD CCI
SVC 0
JMP FIN
END GENERE
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.