Path: utzoo!censor!geac!torsqnt!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!inria!litp!pda From: pda@litp.ibp.fr (Pierre DAVID) Newsgroups: comp.sys.handhelds Subject: Saturn Assembler (Part 2/8) Message-ID: <3303@litp.ibp.fr> Date: 5 Jul 90 16:21:35 GMT Reply-To: pda@litp.ibp.fr.UUCP (Pierre DAVID) Organization: M.A.S.I., Universite P. & M. Curie, Paris, FRANCE Lines: 1698 #---------------------------------- cut here ---------------------------------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by Pierre David on Sun Jul 1 12:32:51 1990 # # This archive contains: # areuh/linker/llist.c areuh/linker/linit.c # areuh/linker/lglobal.h areuh/linker/lerror.c # areuh/linker/flag.h areuh/linker/ald.1 # areuh/linker/Makefile areuh/dump/adp.c # areuh/dump/common.h areuh/dump/err.h # areuh/dump/adp.1 areuh/dump/Makefile # areuh/doc/areuh.doc # # Error checking via wc(1) will be performed. LANG=""; export LANG PATH=/bin:/usr/bin:$PATH; export PATH echo x - areuh/linker/llist.c cat >areuh/linker/llist.c <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ #include "lglobal.h" FILE *fd_l ; int l_line = 0, l_page = 1 ; void l_files (), l_xref () ; void l_init () { uchar dfl [MAXLEN+1] ; switch (cntlist) { case 0 : break ; case 1 : fd_l = stdout ; strcpy (flisting, "stdout") ; break ; case 2 : dfl_extension (dfl, "list", "al") ; look_obj (flisting, dfl) ; if (!(fd_l = fopen (flisting, "w"))) error (ERROPN, flisting) ; break ; } } void l_new_page (flag) int flag ; { if (!cntlist) return ; for (; l_lines_next ; while (t) { if (!t->s_os) { hex5 (tmp, t->s_value) ; sprintf (line, format, t->s_name, tmp, fname[t->s_file]) ; l_print (line) ; x = t->s_xref ; while (x) { hex5 (tmp, tmodule[x->x_file].m_ad + x->x_pc) ; hex5 (rel, x->x_pc) ; sprintf (line, xformat, "", tmp, rel, fname[x->x_file]) ; l_print (line) ; x = x->x_next ; } } /* du if */ t = t->s_next ; } /* du while */ } /* du for */ } @EOF set `wc -lwc areuh/linker/linit.c <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ #include "lglobal.h" extern void l_init () ; extern uchar *memoire () ; void free_mem () ; init() { struct symbol *s ; int i ; head_unres = (struct unres *) NULL ; s = (struct symbol *) memoire (256*sizeof(struct symbol)) ; for (i=0; i<256; i++) { strcpy (s->s_name, "") ; s->s_value = 0L ; s->s_file = 0 ; s->s_os = 1 ; s->s_xref = (struct xtable *) NULL ; s->s_next = (struct symbol *) NULL ; h_label [i] = s++ ; } l_init () ; file = errnb = passbis = 0 ; load_file (HP71EP) ; passnb = 1 ; } between () { long int magic = AL_MAGIC ; uchar dfl [MAXLEN+1] ; strcpy (dfl, "lex") ; look_obj (flex, dfl) ; if (!(fplex = fopen (flex, "w"))) error (ERROPN, flex) ; fwrite (&magic, sizeof (long int), 1, fplex) ; if (ferror (fplex)) error (flex) ; passnb = 2 ; } term () { if (fclose (fplex)) error (ERRCLO, flex) ; if (cntlist || xref) report () ; l_flush () ; free_mem () ; } void free_mem () { struct symbol *s1, *s2 ; struct xtable *x1, *x2 ; int i ; for (i=0; i<=255; i++) { s1 = h_label[i]->s_next ; while (s1) { if (xref) { x1 = s1->s_xref ; while (x1) { x2 = x1->x_next ; free ((char *) x1) ; x1 = x2 ; } } s2 = s1->s_next ; free ((char *) s1) ; s1 = s2 ; } } free ((char *) h_label [0]) ; for (i=0; i<=nfile+1; i++) free ((char *) fname [i]) ; } @EOF set `wc -lwc areuh/linker/lglobal.h <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ #include "common.h" #define fgetl(lg,fp) fread(&(lg),sizeof(long int),1,fp) /****************************************************************************** MODULE TABLE ******************************************************************************/ #define MAXMOD 80 /* maximum number of modules */ struct module /* module descriptor */ { long int m_part3 ; /* address of utilisations part */ saddr m_ad ; /* Saturn address of start of code */ } ; extern struct module tmodule [] ; /* module descriptors table */ /****************************************************************************** UNRESOLVED LABELS LIST ******************************************************************************/ struct unres /* unresolved label element */ { uchar u_label [LBLLEN+2] ; /* label name (with leading '=') */ uchar u_file ; /* file where declared */ uchar *u_def ; /* definition address */ struct unres *u_next ; /* next element */ } ; extern struct unres *head_unres ; /* unresolved label list */ /****************************************************************************** CROSS-REFERENCE LIST ******************************************************************************/ struct xtable { saddr x_pc ; /* relative addr. where symb. is used */ uchar x_file ; /* file where symbol is used */ struct xtable *x_next ; /* link */ } ; /****************************************************************************** LABEL TABLE ******************************************************************************/ struct symbol { uchar s_name [LBLLEN+2] ; /* label name */ saddr s_value ; /* label value */ uchar s_file ; /* last file where label is declared */ uchar s_os ; /* 1 is O.S. entry point not used */ struct xtable *s_xref ; /* head of xref list */ struct symbol *s_next ; /* next label */ } ; extern struct symbol *h_label [] ; /* pseudo-hash table */ /****************************************************************************** CODE ******************************************************************************/ extern uchar *code ; extern uchar *fname[] ; extern uchar flex [], flisting [] ; extern FILE *fplex ; extern saddr pc ; extern nfile, file ; extern int cntlist, page_size, xref, passnb, errnb, passbis ; extern uchar hp71ep [] ; @EOF set `wc -lwc areuh/linker/lerror.c <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ /****************************************************************************** AREUH LINKER ERROR PROCESSING error ******************************************************************************/ #include "lglobal.h" /****************************************************************************** ERROR synopsis : void error (errno, msg) int errno char *msg descritpion : reports an error message on listing file, if any, else on standard output. ******************************************************************************/ void error (errno, msg) int errno ; uchar *msg ; { uchar txt[MAXLEN+1], tmp[MAXLEN+1]; switch (errno) { case ERROPN : sprintf (txt, "system error opening file %s", msg) ; break ; case ERRCLO : sprintf (txt, "system error closing file %s", msg) ; break ; case ERRWRT : sprintf (txt, "system error writing file %s", msg) ; break ; case ERRRD : sprintf (txt, "system error reading file %s", msg) ; break ; case ERRMEM : strcpy (txt, "not enough memory"); break ; case ERRUSA : strcpy (txt, "usage: ald [-p] [-l n] [-A] [-a file]") ; strcat (txt, " [-o object_file] file1 file2..filen") ; break ; case ERRICV : sprintf (txt, "incompatible version of file %s", fname[file]) ; break ; case ERRNOA : sprintf (txt, "file %s not an output from aas", fname[file]) ; break ; case WRNDUP : sprintf (txt, "duplicate label %s", msg) ; break ; case WRNURF : hex5 (tmp, pc) ; sprintf (txt, "unresolved reference at %s in file %s : %s", tmp, fname[file], msg) ; break ; case WRNURL : sprintf (txt, "unresolved label %s in file %s", msg, fname[file]) ; break ; case WRNEXP : strcpy (txt, "illegal expression"); break ; case WRNASC : strcpy (txt, "illegal ascii constant"); break ; case WRNPAR : strcpy (txt, "mismatched parenthesis"); break ; case WRNIHX : strcpy (txt, "illegal hexadecimal constant"); break ; case WRNNUL : strcpy (txt, "null divisor"); break ; case WRNIXP : strcpy (txt, "illegal exponentiation") ; break ; case WRNIBC : strcpy (txt, "illegal binary constant") ; break ; case WRNJVL : hex5 (tmp, pc) ; sprintf (txt, "jump or value too large at %s in file %s : %s", tmp, fname[file], msg) ; break ; } if (errno<0) { fprintf (stderr, "ald: %s\n", txt) ; exit (errno) ; } else { errnb++ ; if (! ((passnb==1)&&(!passbis)&&(errno==WRNURL)) ) l_print (txt) ; } } /* end of "error()" */ @EOF set `wc -lwc areuh/linker/flag.h <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ /****************************************************************************/ /* !!! CONTENTS OF THIS FILE MUST BE DIFFERENT FOR ASSEMBLER AND LINKER !!! */ /****************************************************************************/ #define ASSEMBLER 0 #define LINKER 1 @EOF set `wc -lwc areuh/linker/ald.1 <<'@EOF' .TH ALD 1L .SH NAME ald \- areuh link editor .SH SYNOPSIS .B ald [ .B -p ] [ .B -l .I page length ] [ .B -A ] [ .B -a .I listing file ] [ .B -x ] [ .B -o .I object file ] [ file1 ... filen ] .SH DESCRIPTION .I Ald est le cross-link-editor pour le HP-71, qui prend un ou des fichiers intermediaires, les fusionne et place dans le fichier objet un fichier pret a etre transmis au HP-71 (voir .IR cp71 (1L)). .PP Les options sont : .TP 17 .B -p Utilisation interactive : demande les noms des fichiers au clavier. Option par defaut lorsqu'il n'y a aucun parametre. .TP .BI -l " page length" La longueur des pages du .I listing file est fixee a .I page length lignes (72 par defaut). .TP .B -A Genere un listing d'edition avec table des symboles. Le listing est envoye sur la sortie standard. .TP .BI -a " listing file" Genere un listing d'edition dans le fichier .IR "listing file" . .TP .I -x Genere dans le .I listing file une table des references croisees, indiquant pour chaque symbole sa valeur et les offsets dans les fichiers des instructions y faisant reference. .TP .BI -o " object file" Place le code objet dans le fichier specifie .RB ( lex par defaut) .SH AUTHORS Pierre David Janick Taillandier .SH SEE ALSO aas(1L), adp(1L), amg(1L), cp71(1L). .br .I "IDS vol I" for HP-71. @EOF set `wc -lwc areuh/linker/Makefile <<'@EOF' # # Makefile genere automatiquement par mkmf (le masque par defaut a ete adapte) # CFLAGS = -O LDFLAGS = LIBS = SYSLIBS = BINDEST = /usr/local/bin # # S'il y a plus d'un programme, il faut aussi remplacer la cible # $(PROGRAM) par autant de cibles que necessaire. # PROGRAM = ald SRCS = exp.c \ lerror.c \ linit.c \ llist.c \ lmain.c \ lpass.c \ lutil.c \ mdep.c HDRS = common.h \ err.h \ flag.h \ lglobal.h EXTHDRS = /usr/include/stdio.h \ /usr/include/sys/stat.h \ /usr/include/sys/types.h OBJS = exp.o \ lerror.o \ linit.o \ llist.o \ lmain.o \ lpass.o \ lutil.o \ mdep.o MANDEST = /usr/local/man/man1.Z MANPAGES = ald.1 # # Les cibles : # all : compiler tout # clean : effacer les .o et les core # clobber : effacer tout ce qui peut etre regenere # depend : recalculer toutes les dependances et les inserer ici # install : installe le programme dans l'aborescence # tags : cree les tags # all: $(PROGRAM) $(PROGRAM): $(OBJS) $(LIBS) cc $(LDFLAGS) $(OBJS) $(LIBS) $(SYSLIBS) -o $(PROGRAM) clean:; rm -f $(OBJS) core clobber:; rm -f $(OBJS) $(PROGRAM) core tags depend:; mkmf ROOT=$(ROOT) install: $(PROGRAM) -strip $(PROGRAM) if [ $(BINDEST) != . ] ; \ then \ (cd $(BINDEST) ; rm -f $(PROGRAM)) ; \ cp $(PROGRAM) $(BINDEST) ; \ if [ "$(MANPAGES)" != none ] ; \ then \ (cd $(MANDEST) ; rm -f $(MANPAGES)) ; \ for i in $(MANPAGES) ; \ do \ compress < $$i > $(MANDEST)/$$i ; \ done ; \ fi ; \ fi tags: $(HDRS) $(SRCS) ctags $(HDRS) $(SRCS) # # Dependances calculees automatiquement par mkmf. # Ne rien changer apres cette ligne ! # ### exp.o: flag.h lglobal.h common.h /usr/include/stdio.h err.h lerror.o: lglobal.h common.h /usr/include/stdio.h err.h linit.o: lglobal.h common.h /usr/include/stdio.h err.h llist.o: lglobal.h common.h /usr/include/stdio.h err.h lmain.o: lglobal.h common.h /usr/include/stdio.h err.h lpass.o: lglobal.h common.h /usr/include/stdio.h err.h lutil.o: lglobal.h common.h /usr/include/stdio.h err.h mdep.o: flag.h lglobal.h common.h /usr/include/stdio.h err.h \ /usr/include/sys/types.h /usr/include/sys/stat.h @EOF set `wc -lwc areuh/dump/adp.c <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ #include "common.h" #define fgetl(lg,fp) fread(&(lg),sizeof(long int),1,fp) main (argc, argv) int argc ; char *argv[] ; { FILE *fp ; uchar line [MAXLEN + 1], hexvar[MAXLEN+1], type ; saddr magic, pc, p2, p3, nu, nl, i, j, characteristic, value ; if (argc!=2) { fprintf (stderr, "usage: adp file\n") ; exit (1) ; } fp = fopen (argv[1], RAO_MODE) ; if (fp==NULL) { fprintf (stderr, "adp: error opening %s\n", argv[1]) ; exit (1) ; } printf ("file %s : ", argv[1]) ; fgetl (magic, fp) ; if ((magicAO_MAGIC)) { fprintf (stderr, "adp: %s is not an Areuh object file\n", argv [1]) ; exit (1) ; } printf ("version %d\n", magic - AOF_MAGIC) ; if (magic!=AO_MAGIC) { fprintf (stderr, "Wrong version\n") ; exit (1) ; } fgetl (p2, fp) ; fgetl (pc, fp) ; printf ("code: length (in nibbles) = %ld\n", pc) ; fseek (fp, p2, 0) ; fgetl (p3, fp) ; fgetl (nl, fp) ; printf ("public definitions : number = %ld\n", nl) ; for (i=1; i<=nl; i++) { printf ("%4d:", i) ; j = 0 ; while ((line [j] = (uchar) getc (fp)) != '\n') j++ ; line [j]= EOL ; printf (" %-13s, val = ", line) ; /* LBLLEN + 1 */ fgetl (value, fp) ; if (value >= (saddr) 0) { hex5 (hexvar, value) ; printf ("%s, ", hexvar) ; type = getc (fp) ; switch (type) { case LABS : printf ("Abs") ; break ; case LREL : printf ("Rel") ; break ; case LUDF : printf ("Udf") ; break ; default : printf ("Type aie aie aie") ; break ; } } else if (value == LBL_UDF) { printf ("-UDF-") ; } else if (value == LBL_IVL) { printf ("-IVL-") ; } else if (value == LBL_EXT) { printf ("-EXT-") ; } else if (value == LBL_XEQ) { printf ("-XEQ-") ; fscanf (fp, "%s\n", line) ; printf (", definition = %s", line) ; } else /* (value == LBL_SEQ) */ { printf ("-SEQ-") ; } printf ("\n") ; } fgetl (nu, fp) ; printf ("references not resolved: number = %d\n", nu) ; for (i=1; i<=nu; i++) { fgetl (characteristic, fp) ; fgetl (pc, fp) ; fscanf (fp, "%s\n", line) ; printf ("%4d:", i) ; hex5 (hexvar, pc) ; printf (" pc = %s", hexvar) ; printf (", type = ") ; switch ((int) (characteristic & 0xf0)) { case XABSL : printf ("XABSL") ; break ; case XABSO : printf ("XABSO") ; break ; case XRGTO : printf ("XRGTO") ; break ; case XRGSB : printf ("XRGSB") ; break ; } printf (", length = %1d", characteristic & 0xf) ; printf (", val = %s\n", line) ; } } /* function called indirectly, via hex5 */ format_hex (str, val, dig) uchar *str ; saddr val ; int dig ; { register int i, h ; for (i=dig-1; i>=0; i--) { h = (int) (val & ((saddr) 0xf)) ; str [i] = h + ((h < 10) ? '0' : 'A' - 10) ; val >>= 4 ; } str [dig] = EOL ; } @EOF set `wc -lwc areuh/dump/common.h <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ #include #define MAXLEN 256 #define EOL '\0' #define LBLLEN 12 /****************************************************************************** TYPE DEFINITIONS ******************************************************************************/ typedef long int saddr ; /* Saturne address. At least 32 bits */ typedef unsigned char uchar ; /* unsigned characters, for accents */ typedef short int sint ; /* 16 bits */ /****************************************************************************** MAGIC NUMBERS ******************************************************************************/ #define AL_MAGIC 0x1b080100 /* ... areuh_lex */ #define AO_MAGIC 0x1b0d0100 /* ... areuh_output of assembler */ #define ALF_MAGIC 0x1b080100 /* first version of object file format */ #define AOF_MAGIC 0x1b0d0100 /* first version of object file format */ /****************************************************************************** USAGE TYPES IN .ao FILES ******************************************************************************/ #define XABSL 0x10 /* absolute reference */ #define XABSO 0x20 /* absolute reference, with one bias */ #define XRGTO 0x40 /* relative reference, goto type */ #define XRGSB 0x80 /* relative reference, gosub type */ /****************************************************************************** LABEL VALUES IN .ao FILES ******************************************************************************/ #define LBL_UDF -1L /* label not declared (implicit or explicit) <=> only used */ #define LBL_IVL -2L /* invalid label (invalid expression for an EQU during pass one) */ #define LBL_EXT -3L /* external label not defined here (or yet) */ #define LBL_XEQ -4L /* global label which is defined here, with an external reference */ #define LBL_SEQ -5L /* local label which is defined with an external reference */ /****************************************************************************** LABEL TYPES IN .ao FILES ******************************************************************************/ #define LUDF 0 /* undefined type (external label) */ #define LABS 1 /* absolute local label (declared explicitly, with constants) */ #define LREL 2 /* relative local label (declared implicitly, or explicitly with at least one relative) */ /****************************************************************************** VALUES RETURNED BY EXPRESSION EVALUATOR ******************************************************************************/ #define EXP_ERR -1L #define EXP_EXT -2L extern int relabs ; extern uchar extexp[] ; #include "err.h" extern void error () ; #define hex5(str,val) format_hex (str, val, 5) ; #define hex6(str,val) format_hex (str, val, 6) ; /****************************************************************************** MACHINE DEPENDANCIES ******************************************************************************/ #define HPUX 1 #define ATARI_LATTICE 0 #define PC_MSC 0 /* PC (beuark, Microsoft C) */ #if HPUX extern void format_time(), load_file() ; #define HP71EP "hp71.ep" #define RAO_MODE "r" #define WAO_MODE "w" #define skip(fp) #endif #if ATARI_LATTICE extern void format_time(), load_file() ; #define HP71EP "hp71.ep" #define RAO_MODE "rb" #define WAO_MODE "wb" extern char skipvar ; #define skip(fp) fread(&skipvar,1,1,fp) ; #endif #if PC_MSC extern void format_time(), load_file() ; #define HP71EP "hp71.ep" #define RAO_MODE "rb" #define WAO_MODE "wb" extern char skipvar ; #define skip(fp) fread(&skipvar,1,1,fp) ; #endif @EOF set `wc -lwc areuh/dump/err.h <<'@EOF' /* * Authors : * Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet) * Janick TAILLANDIER * * This program can be freely used or distributed as long as this * note is kept. * * This program is provided "as is". */ /****************************************************************************** AREUH ASSEMBLER / LINKER ERROR NUMBERS DECLARATIONS ******************************************************************************/ /* FATAL ERRORS */ #define ERROPN -1 /* A L */ /* system error opening file */ #define ERRCLO -2 /* A L */ /* system error closing file */ #define ERRREW -3 /* A */ /* system error on file at start of pass two */ #define ERRWRT -4 /* A L */ /* system error writing file */ #define ERRRD -5 /* A L */ /* system error reading file */ #define ERRMEM -6 /* A L */ /* not enough memory */ #define ERRLEX -10 /* A */ /* invalid macro pseudo-op LEX or BIN */ #define ERRPGS -11 /* A */ /* invalid page size */ #define ERRFLN -12 /* A */ /* restricted label FiLeNd exists */ #define ERRIFL -13 /* A L */ /* invalid file name */ #define ERRIMO -14 /* A */ /* invalid macro-op xx in modular assembling */ #define ERRVMD -15 /* A */ /* value must be defined for xx */ #define ERRUSA -20 /* A L */ /* usage: ass [ [-l] source_file ] */ /* usage: ald ... */ #define ERRNOA -30 /* L */ /* file not output from aas */ #define ERRICV -31 /* L */ /* incompatible version */ /* NON FATAL ERRORS */ #define WRNEQU 10 /* A */ /* cannot resolve equate */ #define WRNDUP 11 /* A L */ /* duplicate label */ #define WRNLBL 12 /* A */ /* illegal label */ #define WRNULB 13 /* A */ /* unrecognized label */ #define WRNURF 14 /* L */ /* unresolved reference */ #define WRNURL 15 /* L */ /* unresolved label */ #define WRNEXP 20 /* A */ /* illegal expression */ #define WRNASC 21 /* A */ /* illegal ascii constant */ #define WRNPAR 22 /* A */ /* mismatched parenthesis */ #define WRNIHX 23 /* A */ /* illegal hexadecimal constant */ #define WRNNUL 24 /* A */ /* null divisor */ #define WRNIXP 25 /* A */ /* illegal exponentiation */ #define WRNIBC 26 /* A */ /* illegal binary constant */ #define WRNENA 27 /* A */ /* external references not allowed */ #define WRNYES 30 /* A */ /* GOYES or RTNYES required */ #define WRNIDP 31 /* A */ /* illegal dp arithmetic value */ #define WRNIPP 32 /* A */ /* illegal pointer position */ #define WRNISB 33 /* A */ /* illegal status bit */ #define WRNTFR 34 /* A */ /* illegal transfer value */ #define WRNIWS 35 /* A */ /* illegal word select */ #define WRNLST 36 /* A */ /* invalid LIST argument */ #define WRNJVL 37 /* A L */ /* jump or value too large */ #define WRNMLB 38 /* A */ /* missing label */ #define WRNTST 39 /* A */ /* needs previous test instruction */ #define WRNNHX 40 /* A */ /* non hexadecimal digits present */ #define WRNTMA 41 /* A */ /* too many ascii characters present */ #define WRNTMH 42 /* A */ /* too many hexadecimal digits present */ #define WRNOPC 43 /* A */ /* unknown opcode */ #define WRNIIF 50 /* A */ /* invalid conditional structure */ extern void error() ; @EOF set `wc -lwc areuh/dump/adp.1 <<'@EOF' .TH ADP 1L .SH NAME adp \- areuh intermediate file dump .SH SYNOPSIS .B adp file .SH DESCRIPTION .I Adp affiche des informations sur le fichier intermediaire specifie. En particulier, .B adp affiche la taille du code, les symboles externes definis dans ce fichier, ainsi que les expressions n'ayant pas pu etre resolues a l'assemblage. .PP .B Adp a ete developpe pour des besoins internes et ne doit normalement pas etre utilise. .SH AUTHORS Pierre David Janick Taillandier .SH SEE ALSO aas(1L), ald(1L), amg(1L), cp71(1L). .br .I "IDS vol I" for HP-71. @EOF set `wc -lwc areuh/dump/Makefile <<'@EOF' # # Makefile genere automatiquement par mkmf (le masque par defaut a ete adapte) # CFLAGS = -O LDFLAGS = LIBS = SYSLIBS = BINDEST = /usr/local/bin # # S'il y a plus d'un programme, il faut aussi remplacer la cible # $(PROGRAM) par autant de cibles que necessaire. # PROGRAM = adp SRCS = adp.c HDRS = common.h \ err.h EXTHDRS = /usr/include/stdio.h OBJS = adp.o MANDEST = /usr/local/man/man1.Z MANPAGES = adp.1 # # Les cibles : # all : compiler tout # clean : effacer les .o et les core # clobber : effacer tout ce qui peut etre regenere # depend : recalculer toutes les dependances et les inserer ici # install : installe le programme dans l'aborescence # tags : cree les tags # all: $(PROGRAM) $(PROGRAM): $(OBJS) $(LIBS) cc $(LDFLAGS) $(OBJS) $(LIBS) $(SYSLIBS) -o $(PROGRAM) clean:; rm -f $(OBJS) core clobber:; rm -f $(OBJS) $(PROGRAM) core tags depend:; mkmf ROOT=$(ROOT) install: $(PROGRAM) -strip $(PROGRAM) if [ $(BINDEST) != . ] ; \ then \ (cd $(BINDEST) ; rm -f $(PROGRAM)) ; \ cp $(PROGRAM) $(BINDEST) ; \ if [ "$(MANPAGES)" != none ] ; \ then \ (cd $(MANDEST) ; rm -f $(MANPAGES)) ; \ for i in $(MANPAGES) ; \ do \ compress < $$i > $(MANDEST)/$$i ; \ done ; \ fi ; \ fi tags: $(HDRS) $(SRCS) ctags $(HDRS) $(SRCS) # # Dependances calculees automatiquement par mkmf. # Ne rien changer apres cette ligne ! # ### adp.o: common.h /usr/include/stdio.h err.h @EOF set `wc -lwc areuh/doc/areuh.doc <<'@EOF' ASSEMBLEUR / EDITEUR DE LIENS POUR LE HP71 I - PRINCIPE A: Presentation Le systeme de developpement pour HP71 que nous presentons ici est base sur un assembleur et un editeur de liens ecrits en Langage C. Ce systeme fonctionne a l'heure actuelle sur des ordinateurs differents : - Les ordinateurs fonctionnant sous systeme HP-UX en particulier, et sous systeme Unix en general. - les ordinateurs Atari 520 et 1040 ST sous systeme d'exploitation TOS. - une adaptation est en cours pour l'ordinateur HP Vectra et autres IBM PC sous systeme MS-DOS. Tous nos efforts se sont portes vers la reduction des temps d'assemblage. Voir les temps d'execution donnes en exemple pour plus de details. B: Introduction a l'assembleur L'assembleur a deux modes de fonctionnement : Le mode "assemblage complet", qui permet d'avoir la compatibilite avec le "machin" (l'assembleur du module Forth). En particulier, toutes les macro-operations de generation de fichiers lex ou bin sont supportees. Le mode "assemblage separe" permet de se rapprocher des conditions de travail de l'equipe de developpement du HP71 aux laboratoires de Corvallis (OR 97330) en autorisant l'assemblage de modules separes, et leur reunion en seul fichier par l'intermediaire de l'editeur de liens. C: Avantages et inconvenients Parmi les nombreux avantages que procure ce systeme, nous pouvons citer : Utilisation des points d'entree HP sans avoir a les declarer explicitement par une operation du type EQU. Edition d'une table des references croisees donnant pour chaque symbole le nom, la valeur, la ligne ou il est declare et les lignes ou il est utilise. Introduction de nouveaux operateurs dans les expressions, et possibilite d'introduire des valeurs en binaire. Les noms des labels sont maintenant significatifs sur 12 caracteres. Quant aux inconvenients, il manque les pseudo-operations FORTH, WORD et WORDI. Et, bien sur, il faut un "gros" ordinateur. D: Principe de l'assemblage separe L'assemblage d'un fichier en modules separes se fait en deux phases. IL faut d'abord assembler tous les fichiers (modules) constituant le source. Ensuite, il faut proceder a l'edition de liens, qui rassemble ces modules en un seul fichier. Si il s'avere necessaire de modifier une partie du texte source, il suffit seulement de re-assembler le module contenant ce texte, et de refaire l'edition de liens. Le gain de temps est enorme. Cette gestion modulaire permet egalement un traitement plus efficace des labels. Un module peut appeler une routine ecrite dans un autre module a partir du moment ou le label est precede d'un signe '=' dans les modules concernes. Ceci a pour role de declarer le label externe (dans le module appelant) ou public (dans le module ou le label est declare) et accessible a tous. Ce sont les labels globaux. A cette categorie s'ajoute celle des labels locaux. Ils ne comportent pas de signe '=', et des modules peuvent avoir des labels portant le meme nom. Ceci permet d'avoir, par exemple, plusieurs labels "argerr" dans des modules differents, sans causer le moindre conflit. C'est le meme systeme que celui employe par HP, et decrit dans les IDS Vol. I (ch. 16). Seul ce systeme permet le developpement de grands programmes en assembleur. II - DIFFERENCES AVEC LE "MACHIN" A: Selection du mode La selection du mode d'assemblage (complet ou separe) est faite par la presence de la macro LEX ou BIN en premiere ligne du fichier source. B: Majuscules / Minuscules Mis a part les labels, tous les op-codes et toutes les expressions sont compris aussi bien en majuscules qu'en minuscules. C: Macro-operation interdites En assemblage separe, les pseudo-operations de generation de fichiers LEX ou BIN sont interdites. Ainsi, LEX, ID, MSG, POLL, ENTRY, CHAR, TOKEN, KEY, ENDTXT, BIN et CHAIN sont interdites hors d'un assemblage complet. On exerce ainsi un controle plus precis sur la generation du code. Par ailleurs, les macro FORTH, WORD et WORDI sont interdites. Seule la premiere utilisation de TITLE est prise en compte. D: Macro-operations ajoutees En premier lieu, il y a RDSYMB (ReaD SYMBols). Elle permet de charger un fichier contenant des points d'entree sans avoir a attendre l'edition de liens. Par exemple, en assemblage complet, ceci permet d'avoir les points d'entree supportes par HP (fichier "hp71.ep"). La syntaxe est : RDSYMB Ensuite, nous avons l'assemblage conditionnel. Par exemple, si nous avons : AREUH EQU 1 IF AREUH P=P+1 RTN ELSE ASRB C+P+1 ENDIF Seul le code P=P+1 et RTN sera assemble. Inversement, si AREUH avait ete declare avec une valeur nulle, le code ASRB et C+P+1 aurait ete assemble. Ceci permet de gerer simplement des versions differents d'un meme programme (versions de mise au point). Attention cependant : il ne peut y avoir imbrication d'une telle structure conditionnelle. E: Opcodes ajoutes D0=HEX et D1=HEX (presents, mais non documentes dans le "machin") fonctionnent a merveille. LC(6) et CON(6) (utilises par HP) sont presents. F: Valeurs numeriques Les valeurs numeriques calculees dans les expressions, ou renvoyees par des labels comportent six chiffres hexadecimaux et non cinq comme dans le "machin". Comme dans les IDS. En revanche, les valeurs affichees dans les tables de symboles le sont sur cinq chiffres seulement. Cette limitation ne concerne que l'affichage et non le stockage interne. Ceci est conforme a l'affichage fourni par l'assembleur des IDS, et a ete conserve en raison de l'habitude acquise a la lecture des adresses du HP71. G: Les Expressions Les expressions peuvent contenir des labels, la valeur du compteur ordinal (PC), des constantes et des operateurs. Il n'y a pas de limitation du niveau d'imbrication des parentheses. Maintenant, les labels sont significatifs sur 12 caracteres. Le symbole '*' (en position d'operande) est considere comme la valeur du compteur ordinal. Dans le cas d'une compilation separee, cette valeur est la valeur reelle, tenant compte de la position du module dans le fichier complet. Les constantes de valeur superieure a six chiffres hexadecimaux sont tronquees. Les constantes Ascii sont delimitees soit par des apostrophes ('), soit par des anti-slash (\). Un nouveau type de constante est ajoutee : les constantes binaires. Elles doivent etre precedees d'un signe '%', comme dans : %01110001 Les operateurs : nous en donnons la liste complete, par ordre de priorite decroissante. Les operateurs de meme priorite sont evalues de gauche a droite. @~ (*256+) ^ (puissance) - (moins unaire) ` (complement a 1) & (et logique) ! (ou logique) * (multiplication) / (division entiere) + (addition) - (soustraction) H: FiLeNd Le label FiLeNd est ajoute systematiquement a la fin de chaque fichier ou module assemble. En outre, le label global "=FiLeNd" est ajoute automatiquement en fin de fichier lors de l'edition de liens pour l'assemblage separe. III - MODE D'EMPLOI DES PROGRAMMES Les deux programmes "aas" et "ald" admettent les memes options. -o Specifie le nom du fichier resultant de l'assemblage ou de l'edition de liens. -a Demande l'impression d'un listing d'assemblage ou d'edition de liens. Le listing est envoye dans le fichier specifie. -A Demande l'impression d'un listing d'assemblage ou d'edition de liens. Le listing est envoye a l'affichage (ou stdout sur les systemes Unix). -l Specifie la longueur physique des pages, en nombre de lignes. La longueur du texte sera inferieure de 6 lignes. -x Demande l'impression d'une table des references croisees. -p Active la saisie interactive des options decrites precedemment. Notons que ne donner aucun parametre active implicitement cette option. Pour aas, il faut ensuite fournir le nom du fichier source. Pour ald, il faut fournir les noms de tous les modules. Par defaut, le fichier genere a pour nom "lex". Les fichiers source ont ".as" comme suffixe (extension), et les fichiers intermediaires (entre l'assembleur et l'editeur de liens) ont ".ao" comme suffixe. En general, il n'est pas necessaire d'indiquer ces extensions. IV - EXEMPLES Assembler le fichier f1.as (qui commence par une macro LEX), et fichier assemble dans "lex" : aas f1 Assembler le fichier f1.as avec listing, references croisees dans le fichier "list", et fichier resultat dans "lex" : aas -xalist f1 aas -x -a list f1 Meme exemple que precedemment avec une longueur de page de 66 lignes (papier 11") : aas -xalist -l66 f1 Assembler le fichier f1.as, avec resultat dans "toto", avec parametrage interactif : aas puis entrer "f1" puis entrer "toto" puis entrer [RETURN] Les fichiers f1.as, f2.as et f3.as continennent le source d'un fichier lex. Assemblage des trois fichiers : aas f1 aas f2 aas f3 Edition de liens des fichiers f1, f2 et f3 (fi.ao pour i=1..3), avec demande d'un listing et d'une table des references croisees dans le fichier "list", et fichier assemble nomme "totolex". ald -xalist -ototolex f1 f2 f3 Pierre David (PC37, SIG1, CHHU616) Janick Taillandier (PC246, SIG6, CHHU178) @EOF set `wc -lwc