<*********************************************************************** <* * <* * <* 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