/* * Put all the listing stuff in here */ #include "as68.h" #define LPP 58 /* # Lines per listing page */ int xline = LPP; /* Current line on page */ int xpage = 0; /* Current page # */ short pline; /* Current listing line # */ /****************************************************************************/ /* */ /* .page directive handlers (from dir.c). */ /* */ /****************************************************************************/ hpage() /* Pass 1 .page routine */ { /************************************/ opitb(); /* Output statement beginning */ wostb(); /* Remaining part of statement */ igrst(); /* Ignore optional comment */ } /************************************/ spage() /* Pass 2 .page routine */ { /************************************/ print(0); /* Print directive line */ xline = LPP; /* Force top of */ page(); /* Listing page */ } /************************************/ /****************************************************************************/ /* */ /* Symbol table print routine. "psyms" is called AFTER the symbol table */ /* has been output to the loader file. We sort the symbol table, and print*/ /* the sorted table in PDP-11ish (RT-11) fashion, with a reasonable format */ /* for the symbols. */ /* */ /****************************************************************************/ psyms() /* */ { /****************************/ register long j; /* Temporary */ register char *p; /* -> Symbol table entries */ int symcmp(); /* Symbol comparison func. */ /****************************/ xline = LPP; /* Force page */ page(); /* Eject */ printf("S y m b o l T a b l e\n\n"); /* Print Header */ xline++; /* Bump line counter */ j = ((lmte-bmte)/STESIZE); /* Compute # elements */ qsort(bmte,(int)j,STESIZE,symcmp); /* Sort'em */ j = 0; /* Count symbols / line */ for(p = bmte; p < lmte; p += STESIZE) /* Loop through symbol table*/ { /* */ if(j > 3) /* 4 Symbols / line */ { /* */ printf("\n"); /* Print newline */ page(); /* Check for top of page */ j = 0; /* Reset counter */ } /****************************/ j += psyme(p); /* Print 1 table entry */ } /* (maybe) */ if(j <= 3) /* Partial line? */ printf("\n"); /* Yes, finish it */ } /****************************/ symcmp(a,b) /* Qsort comparison function*/ register char *a,*b; /* -> Elts to compare */ { /****************************/ return(strncmp(a,b,NAMELEN)); /* Return +1 for a > b */ /* 0 for a = b */ /* -1 for a < b */ } /****************************/ /****************************************************************************/ /* */ /* Psyme function. This function prints a single symbol table entry on */ /* the listing file, complete with TEXT, DATA, BSS, EXT, or UNDEF tag. */ /* */ /****************************************************************************/ psyme(osypt) /* Call with -> ST entry */ register struct symtab *osypt; /****************************/ { /* */ register char *p; /* -> Name field */ register int i; /* Count register */ /****************************/ if((osypt->flags & SYER) != 0 || /* Do we need to print it? */ (osypt->flags & SYIN)) /* */ return(0); /* No. */ /****************************/ p = &(osypt->name[0]); /* p -> Symbol name field */ for(i=0;iflags & SYXR) /* External Reference? */ { /* */ printf("******** EXT "); /* Macro-11 style. */ return(1); /* */ } /****************************/ if(osypt->flags & SYDF) /* Defined? */ { /* */ puthex(osypt->vl1.hiword,4); /* Print high word */ puthex(osypt->vl1.loword,4); /* And low word */ if(osypt->flags & SYRA) /* DATA? */ printf(" DATA "); /* Yes. */ else if(osypt->flags & SYRO) /* TEXT? */ printf(" TEXT "); /* Yes. */ else if(osypt->flags & SYBS) /* BSS? */ printf(" BSS "); /* Yes. */ else printf(" ABS "); /* Then it must be absolute */ } /****************************/ else /* */ { /* */ nerror++; /* Bump Error count */ printf("*UNDEFINED* "); /* Identify FUBAR */ } /* */ return(1); /* */ } /****************************/ /* * output source and object listing * call with * 2 => print address and binary code only * 1 => object in ins[] and instr type in format * 0 => print address only */ print(pflag) int pflag; { register short i, *pi; if( !prtflg || fchr == EOF) /*no printing desired, or end of source file*/ return; i = instrlen; instrlen = 1; /*to print preceeding lines*/ while(plinep2absln || pflag==2) putchar('\n'); /*end of line*/ else { prtline(0); if(fchr==EOF) return; putchar('\n'); fchr=gchr(); pline++; } } prtline(flg) int flg; { while(fchr!=EOLC && fchr!=EOF) { putchar(fchr); fchr = gchr(); } } /* * Heading Print routine */ page() { if((prtflg == 0) || (++xline < LPP)) return; printf("\014C P / M 6 8 0 0 0 A s s e m b l e r\t\t%s\t\tPage%4d\n", "Revision 04.03",++xpage); printf("Source File: %s\n\n",sfname); xline = 3; }