⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 output.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)output.c 1.1 92/07/30 SMI";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. *//* *	Microassembler output routines */#include "micro.h"#include <stdio.h>extern char *version();extern short curaddr;extern short maxaddr;extern NODE *curnode, n[];extern NODE *adr[];extern CODE code[];extern CODE *curword;extern SYMBOL *shash[];extern char *abinfile;extern char *binfile;alpha_out(){    /* print listing */    register NODE *nd;    register int i;    CODE *cp;    Boolean any_undef = False;    SYMBOL *sp;    printf( "\nSun Microsystems FPA-3X Microassembler -- Version %s -- Company Confidential\n", version() );    for (i = 0; i < NHASH; i++) {	sp = shash[i];	while (sp != 0) {	    if (!sp->defined) {		if (!any_undef) {		    any_undef = True;		    error ("\nError:  undefined symbols:\n");		}		printf("     %s\n",sp->name);	    }	    sp = sp->next_hash;	}    }/*	Let it print for now    if (any_undef) {	printf("\n");	return;    }*/    printf("Microcode Output\n");    printf("\n            uC  jmp next ram ptr ptr abac ram 8847 op  TI\n");    printf(  "   ln# addr src cc  addr src sel act bits op  inst src bits conf\n");    for( nd = n; nd <=curnode; nd++) {	if (nd->org_pseudo) {	    printf("\t\t\t\t\t\t\t\t%s",nd->line);	} else if (nd->sccsid) {	    printf("%7x  ",nd->addr);	    printf("%04x%04x%04x%04x                           ",cp->word1,cp->word2,cp->word3,		cp->word4 );	    printf("%s", nd->line != 0 ? nd->line : "\n");	} else if (nd->filled) {	    cp = nd->instr;	    printf(" %4d%5x  ",nd->lineno, nd->addr);	    printf(" %01x   %01x  %04x  %01x   %01x   %01x   %02x   %01x   %03x  %02x  %02x    %01x\t",		( cp->word1 >> 14 ) & 0x3,		( cp->word1 >> 10 ) & 0xf,		( ( cp->word1 << 4 ) & 0x3ff0 ) | ( ( cp->word2 >> 12 ) & 0xf ),		( cp->word2 >> 7 ) & 0x7,		( cp->word2 >> 4 ) & 0x7,		( cp->word2 >> 2 ) & 0x3,		( ( cp->word2 >> 6 ) & 0x20 ) | ( ( cp->word3 >> 14 ) & 0x2 ) |		   ( ( cp->word2 << 2 ) & 0xc ) | ( ( cp->word3 >> 10 ) & 0x1 ),		( cp->word3 >> 11 ) & 0xf,		( cp->word3 >> 1 ) & 0x1ff,		( ( cp->word3 << 7 ) & 0x80 ) | ( ( cp->word4 >> 9 ) & 0x7f ),		( cp->word4 >> 2 ) & 0x7f,		cp->word4 & 0x3 );	    printf("%s", nd->line);	}    }}/* * write pseudo binary output */write_abinary(){	int i, j, lastout;	char name[ 256 ];	FILE *f[ 16 ];	lastout = -1;	for ( i = 0; i < 16; i++ ) {		sprintf( name, "%s.%d", abinfile, i );		f[ i ] = fopen( name, "w+" );		if ( f[ i ] == NULL ) {			fprintf( stderr, "%s ", name );			perror( "open failed" );			goto abort;		}	}	for ( i = 0; i < maxaddr; i++ ) {		if ( code[ i ].used ) {			for ( j = lastout + 1; j <= i; j++ ) {				write_code( &code[ j ], f );			}			lastout = i;		}	}abort:	for ( i = 0; i < 16; i++ ) {		fprintf( f[ i ], "\n" );		fclose( f[ i ] );	}}write_code( code, files )	CODE *code;	FILE *files[];{	int i;	unsigned short *word;	word = &code->word1;	for ( i = 0; i < 16; i++ ) {		if ( i % 4 == 0 ) {			fprintf( files[ i >> 2 ], "\n" );		}		if ( *word & ( 0x8000 >> ( i % 16 ) ) ) {			fprintf( files[ i >> 2 ], "1" );		} else {			fprintf( files[ i >> 2 ], "0" );		}	}	word = &code->word2;	for ( i = 0; i < 16; i++ ) {		if ( i % 4 == 0 ) {			fprintf( files[ (i >> 2) + 4 ], "\n" );		}		if ( *word & ( 0x8000 >> ( i % 16 ) ) ) {			fprintf( files[ (i >> 2) + 4 ], "1" );		} else {			fprintf( files[ (i >> 2) + 4 ], "0" );		}	}	word = &code->word3;	for ( i = 0; i < 16; i++ ) {		if ( i % 4 == 0 ) {			fprintf( files[ (i >> 2) + 8 ], "\n" );		}		if ( *word & ( 0x8000 >> ( i % 16 ) ) ) {			fprintf( files[ (i >> 2) + 8 ], "1" );		} else {			fprintf( files[ (i >> 2) + 8 ], "0" );		}	}	word = &code->word4;	for ( i = 0; i < 16; i++ ) {		if ( i % 4 == 0 ) {			fprintf( files[ (i >> 2) + 12 ], "\n" );		}		if ( *word & ( 0x8000 >> ( i % 16 ) ) ) {			fprintf( files[ (i >> 2) + 12 ], "1" );		} else {			fprintf( files[ (i >> 2) + 12 ], "0" );		}	}}/* * write binary output */write_binary(){	int i, j;	int lastout;	FILE *binstream;	binstream = fopen( binfile, "w+" );	if ( binstream == NULL ) {		fprintf( stderr, "%s ", binfile );		perror( "open failed" );		return;	}	lastout = -1;	fwrite( &maxaddr, sizeof maxaddr, 1, binstream );	for ( i = 0; i < maxaddr; i++ ) {		if ( code[ i ].used ) {			for ( j = lastout + 1; j <= i; j++ ) {				fwrite( &code[ j ].word1, sizeof (short), 1, binstream );				fwrite( &code[ j ].word2, sizeof (short), 1, binstream );				fwrite( &code[ j ].word3, sizeof (short), 1, binstream );				fwrite( &code[ j ].word4, sizeof (short), 1, binstream );			}			lastout = i;		}	}	fclose( binstream );}output(){    /* output the listing */    alpha_out();    /* if ascii pseudo binary output is requested then do it */    if ( abinfile != NULL ) {        write_abinary();    }    /* if binary output is requested then do it */    if ( binfile != NULL ) {        write_binary();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -