OpenCores
URL https://opencores.org/ocsvn/copyblaze/copyblaze/trunk

Subversion Repositories copyblaze

[/] [copyblaze/] [trunk/] [copyblaze/] [sw/] [tools/] [asm/] [pBlazASM/] [pBlazDIS/] [pBlazDIS.c] - Rev 2

Compare with Previous | Blame | View Log

/*
 *  Copyright © 2003..2010 : Henk van Kampen <henk@mediatronix.com>
 *
 *	This file is part of pBlazDIS.
 *
 *  pBlazMRG is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  pBlazDIS is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with pBlazDIS.  If not, see <http://www.gnu.org/licenses/>.
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <time.h>
 
#include "pbTypes.h"
#include "pbLibgen.h"
 
#ifdef TCC
#include "getopt.h"
#endif
 
#define MEMSIZE 4096
 
uint32_t Code[ MEMSIZE ] ;
 
static void usage( char * text ) {
	printf( "\n%s - %s\n", text, "Picoblaze Disassembler utility V1.0" ) ;
	printf( "\nUSAGE:\n" ) ;
	printf( "   pBlazDIS [-6] [-v] <MEM inputfile> <PSM outputfile>\n" ) ;
}
 
bool loadMEM( const char * strMEMfile ) {
	int i, j, addr ;
	uint32_t code ;
	char line[ 256 ], *p ;
	FILE * infile = NULL ;
 
	infile = fopen( strMEMfile, "r" ) ;
	if ( infile == NULL ) {
		fprintf( stderr, "? Unable to open MEM file '%s'", strMEMfile ) ;
		return false ;
	}
 
	for ( i = 0 ; i < MEMSIZE ; i++ )
		Code[ i ] = 0 ;
 
	for ( addr = -1 ; addr < MEMSIZE + 128 && fgets( line, sizeof( line ), infile ) != NULL; ) {
		if ( ( p = strchr( line, '@' ) ) != NULL ) {
			if ( sscanf( ++p, "%X", &addr ) != 1 ) {
				fprintf( stderr, "? Error in address in MEM file '%s'", strMEMfile ) ;
				return false ;
			}
		} else {
			if ( addr == -1 ) {
				fprintf( stderr, "? Missing address in MEM file '%s', assuming 0", strMEMfile ) ;
				addr = 0 ;
				// return false ;
			}
			sscanf( line, "%X", &code ) ;
			Code[ addr ] = code ;
			addr += 1 ;
		}
	}
 
	fclose( infile ) ;
	return true ;
}
 
static uint32_t DestReg( const int code ) {
	return ( code >> 8 ) & 0xF ;
}
 
static uint32_t SrcReg( const int code ) {
	return ( code >> 4 ) & 0xF ;
}
 
static uint32_t Constant( const int code ) {
	return code & 0xFF ;
}
 
static uint32_t Address10( const int code ) {
	return code & 0x3FF ;
}
 
static uint32_t Address12( const int code ) {
	return code & 0xFFF ;
}
 
static const char * Condition( const int code ) {
	const char * Conditions[ 4 ] = { "Z", "NZ", "C", "NC" } ;
	return  Conditions[ ( code >> 10 ) & 0x3 ] ;
}
 
static bool writePSM3( const char * strPSMfile ) {
	FILE * outfile = NULL ;
	int pc = 0 ;
	uint32_t c = 0 ;
	enum {
		stIDLE, stCODE, stDATA
	} state = stIDLE ;
 
	outfile = fopen( strPSMfile, "w" ) ;
	if ( outfile == NULL ) {
		fprintf( stderr, "? Unable to open output file '%s'", strPSMfile ) ;
		return false ;
	}
	for ( pc = 0 ; pc < 1024 ; ) {
		c = Code[ pc ] & 0x3FFFF ;
		switch ( state ) {
		case stIDLE :
			if ( c != 0 ) {
				switch ( pc ) {
				case 0x380 :
				    fprintf( outfile, "\n\t.SCR\t0x%.3X\n", pc ) ;
					state = stDATA ;
					break ;
				default :
				    fprintf( outfile, "\n\t.ORG\t0x%.3X\n", pc ) ;
					state = stCODE ;
				}
			} else
				pc += 1 ;
			break ;
		case stCODE :
			if ( c != 0 ) {
				switch ( c ) {
				case 0x00000 ... 0x00FFF :
					fprintf( outfile, "\tMOVE\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x01000 ... 0x01FFF :
					fprintf( outfile, "\tMOVE\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x0A000 ... 0x0AFFF :
					fprintf( outfile, "\tAND \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x0B000 ... 0x0BFFF :
					fprintf( outfile, "\tAND \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x0C000 ... 0x0CFFF :
					fprintf( outfile, "\tOR  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x0D000 ... 0x0DFFF :
					fprintf( outfile, "\tOR  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x0E000 ... 0x0EFFF :
					fprintf( outfile, "\tXOR \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x0F000 ... 0x0FFFF :
					fprintf( outfile, "\tXOR \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x12000 ... 0x12FFF :
					fprintf( outfile, "\tTEST\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x13000 ... 0x13FFF :
					fprintf( outfile, "\tTEST\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x18000 ... 0x18FFF :
					fprintf( outfile, "\tADD \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x19000 ... 0x19FFF :
					fprintf( outfile, "\tADD \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x1A000 ... 0x1AFFF :
					fprintf( outfile, "\tADDC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1B000 ... 0x1BFFF :
					fprintf( outfile, "\tADDC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x1C000 ... 0x1CFFF :
					fprintf( outfile, "\tSUB \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1D000 ... 0x1DFFF :
					fprintf( outfile, "\tSUB \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x1E000 ... 0x1EFFF :
					fprintf( outfile, "\tSUBC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1F000 ... 0x1FFFF :
					fprintf( outfile, "\tSUBC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x14000 ... 0x14FFF :
					fprintf( outfile, "\tCOMP\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x15000 ... 0x15FFF :
					fprintf( outfile, "\tCOMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x20000 ... 0x20FFF :
					switch ( c & 0xF ) {
					case 0x2 :
						fprintf( outfile, "\tRL  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0x6 :
						fprintf( outfile, "\tSL0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0x7 :
						fprintf( outfile, "\tSL1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0x0 :
						fprintf( outfile, "\tSLA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0x4 :
						fprintf( outfile, "\tSLX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
 
					case 0xC :
						fprintf( outfile, "\tRR  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0xE :
						fprintf( outfile, "\tSR0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0xF :
						fprintf( outfile, "\tSR1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0x8 :
						fprintf( outfile, "\tSRA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
					case 0xA :
						fprintf( outfile, "\tSRX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
						break ;
 
					default :
						fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
					}
					break ;
 
				case 0x34000 ... 0x34FFF :
					fprintf( outfile, "\tJUMP\t0x%.3X\t; 0x%.5X\n", Address10( c ), c ) ;
					break ;
				case 0x35000 ... 0x35FFF :
					fprintf( outfile, "\tJUMP\t%s, 0x%.3X\t; 0x%.5X\n", Condition( c ), Address10( c ), c ) ;
					break ;
 
				case 0x30000 ... 0x30FFF :
					fprintf( outfile, "\tCALL\t0x%.3X\t; 0x%.5X\n", Address10( c ), c ) ;
					break ;
				case 0x31000 ... 0x31FFF :
					fprintf( outfile, "\tCALL\t%s, 0x%.3X\t; 0x%.5X\n", Condition( c ), Address10( c ), c ) ;
					break ;
 
				case 0x2A000 ... 0x2AFFF :
					fprintf( outfile, "\tRET\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x2B000 ... 0x2BFFF :
					fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", Condition( c ), c ) ;
					break ;
 
				case 0x2E000 ... 0x2EFFF :
					fprintf( outfile, "\tST  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x2F000 ... 0x2FFFF :
					fprintf( outfile, "\tST  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x06000 ... 0x06FFF :
					fprintf( outfile, "\tLD  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x07000 ... 0x07FFF :
					fprintf( outfile, "\tLD  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x2C000 ... 0x2CFFF :
					fprintf( outfile, "\tOUT \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x2D000 ... 0x2DFFF :
					fprintf( outfile, "\tOUT \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x04000 ... 0x04FFF :
					fprintf( outfile, "\tIN  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x05000 ... 0x05FFF :
					fprintf( outfile, "\tIN  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x3C000 :
					fprintf( outfile, "\tDINT\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x3C001 :
					fprintf( outfile, "\tEINT\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x38000 :
					fprintf( outfile, "\tRETI\tDISABLE\t; 0x%.5X\n", c ) ;
					break ;
				case 0x38001 :
					fprintf( outfile, "\tRETI\tENABLE\t; 0x%.5X\n", c ) ;
					break ;
 
				default :
					fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
				}
				pc += 1 ;
			} else
				state = stIDLE ;
			break ;
		case stDATA :
			if ( c != 0 ) {
				fprintf( outfile, "\t.BYT\t0x%.2X, 0x%.2X\t; 0x%.5X\n", c & 0xFF, ( c >> 8 ) & 0xFF, c ) ;
				pc += 1 ;
			} else
				state = stIDLE ;
			break ;
		}
	}
	fclose( outfile ) ;
	return true ;
}
 
static bool writePSM6( const char * strPSMfile ) {
	FILE * outfile = NULL ;
	int pc = 0 ;
	uint32_t c = 0 ;
	enum {
		stIDLE, stCODE, stDATA
	} state = stIDLE ;
 
	outfile = fopen( strPSMfile, "w" ) ;
	if ( outfile == NULL ) {
		fprintf( stderr, "? Unable to open output file '%s'", strPSMfile ) ;
		return false ;
	}
	for ( pc = 0 ; pc < MEMSIZE ; ) {
		c = Code[ pc ] & 0x3FFFF ;
		switch ( state ) {
		case stIDLE :
			if ( c != 0 ) {
				switch ( pc ) {
				case 0x380 :
				    fprintf( outfile, "\n\t.SCR\t0x%.3X\n", pc ) ;
					state = stDATA ;
					break ;
				default :
				    fprintf( outfile, "\n\t.ORG\t0x%.3X\n", pc ) ;
					state = stCODE ;
				}
			} else
				pc += 1 ;
			break ;
		case stCODE :
			if ( c != 0 ) {
				switch ( c ) {
				case 0x00000 ... 0x00FFF :
					fprintf( outfile, "\tMOVE\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x01000 ... 0x01FFF :
					fprintf( outfile, "\tMOVE\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x16000 ... 0x16FFF :
					fprintf( outfile, "\tSTAR\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x02000 ... 0x02FFF :
					fprintf( outfile, "\tAND \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x03000 ... 0x03FFF :
					fprintf( outfile, "\tAND \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x04000 ... 0x04FFF :
					fprintf( outfile, "\tOR  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x05000 ... 0x05FFF :
					fprintf( outfile, "\tOR  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x06000 ... 0x06FFF :
					fprintf( outfile, "\tXOR \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x07000 ... 0x07FFF :
					fprintf( outfile, "\tXOR \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x0C000 ... 0x0CFFF :
					fprintf( outfile, "\tTEST\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x0D000 ... 0x0DFFF :
					fprintf( outfile, "\tTEST\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x0E000 ... 0x0EFFF :
					fprintf( outfile, "\tTSTC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x0F000 ... 0x0FFFF :
					fprintf( outfile, "\tTSTC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x10000 ... 0x10FFF :
					fprintf( outfile, "\tADD \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x11000 ... 0x11FFF :
					fprintf( outfile, "\tADD \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x12000 ... 0x12FFF :
					fprintf( outfile, "\tADDC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x13000 ... 0x13FFF :
					fprintf( outfile, "\tADDC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x18000 ... 0x18FFF :
					fprintf( outfile, "\tSUB \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x19000 ... 0x19FFF :
					fprintf( outfile, "\tSUB \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x1A000 ... 0x1AFFF :
					fprintf( outfile, "\tSUBC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1B000 ... 0x1BFFF :
					fprintf( outfile, "\tSUBC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x1C000 ... 0x1CFFF :
					fprintf( outfile, "\tCOMP\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1D000 ... 0x1DFFF :
					fprintf( outfile, "\tCOMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x1E000 ... 0x1EFFF :
					fprintf( outfile, "\tCMPC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x1F000 ... 0x1FFFF :
					fprintf( outfile, "\tCMPC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x14000 ... 0x14FFF :
					if ( c & 0xF0 ) {
						fprintf( outfile, "\tCORE\ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
					} else
						switch ( c & 0xF ) {
						case 0x2 :
							fprintf( outfile, "\tRL  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0x6 :
							fprintf( outfile, "\tSL0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0x7 :
							fprintf( outfile, "\tSL1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0x0 :
							fprintf( outfile, "\tSLA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0x4 :
							fprintf( outfile, "\tSLX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
 
						case 0xC :
							fprintf( outfile, "\tRR  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0xE :
							fprintf( outfile, "\tSR0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0xF :
							fprintf( outfile, "\tSR1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0x8 :
							fprintf( outfile, "\tSRA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
						case 0xA :
							fprintf( outfile, "\tSRX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
							break ;
 
						default :
							fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
						}
					break ;
 
				case 0x22000 ... 0x22FFF :
					fprintf( outfile, "\tJUMP\t0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x32000 ... 0x32FFF :
					fprintf( outfile, "\tJUMP\tZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x36000 ... 0x36FFF :
					fprintf( outfile, "\tJUMP\tNZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x3A000 ... 0x3AFFF :
					fprintf( outfile, "\tJUMP\tC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x3E000 ... 0x3EFFF :
					fprintf( outfile, "\tJUMP\tNC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x26000 ... 0x26FFF :
					fprintf( outfile, "\tJUMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x20000 ... 0x20FFF :
					fprintf( outfile, "\tCALL\t0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x30000 ... 0x30FFF :
					fprintf( outfile, "\tCALL\tZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x34000 ... 0x34FFF :
					fprintf( outfile, "\tCALL\tNZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x38000 ... 0x38FFF :
					fprintf( outfile, "\tCALL\tC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x3C000 ... 0x3CFFF :
					fprintf( outfile, "\tCALL\tNC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
					break ;
				case 0x24000 ... 0x24FFF :
					fprintf( outfile, "\tCALL\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
 
				case 0x25000 ... 0x25FFF :
					fprintf( outfile, "\tRET\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x31000 ... 0x31FFF :
					fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "Z", c ) ;
					break ;
				case 0x35000 ... 0x35FFF :
					fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "NZ", c ) ;
					break ;
				case 0x39000 ... 0x39FFF :
					fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "C", c ) ;
					break ;
				case 0x3D000 ... 0x3DFFF :
					fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "NC", c ) ;
					break ;
				case 0x21000 ... 0x21FFF :
					fprintf( outfile, "\tRET \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
 
				case 0x2E000 ... 0x2EFFF :
					fprintf( outfile, "\tST  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x2F000 ... 0x2FFFF :
					fprintf( outfile, "\tST  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x0A000 ... 0x0AFFF :
					fprintf( outfile, "\tLD  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x0B000 ... 0x0BFFF :
					fprintf( outfile, "\tLD  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x2C000 ... 0x2CFFF :
					fprintf( outfile, "\tOUT \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x2D000 ... 0x2DFFF :
					fprintf( outfile, "\tOUT \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
				case 0x2B000 ... 0x2BFFF :
					fprintf( outfile, "\tOUTK\t0x%.2X, 0x%X\t; 0x%.5X\n", ( c >> 4 ) & 0xFF, c & 0xF, c ) ;
					break ;
 
				case 0x08000 ... 0x08FFF :
					fprintf( outfile, "\tIN  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
					break ;
				case 0x09000 ... 0x09FFF :
					fprintf( outfile, "\tIN  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
					break ;
 
				case 0x28000 :
					fprintf( outfile, "\tDINT\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x28001 :
					fprintf( outfile, "\tEINT\t \t; 0x%.5X\n", c ) ;
					break ;
				case 0x29000 :
					fprintf( outfile, "\tRETI\tDISABLE\t; 0x%.5X\n", c ) ;
					break ;
				case 0x29001 :
					fprintf( outfile, "\tRETI\tENABLE\t; 0x%.5X\n", c ) ;
					break ;
 
				case 0x37000 :
					fprintf( outfile, "\tBANK\tA\t; 0x%.5X\n", c ) ;
					break ;
				case 0x37001 :
					fprintf( outfile, "\tBANK\tB\t; 0x%.5X\n", c ) ;
					break ;
 
				default :
					fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
				}
				pc += 1 ;
			} else
				state = stIDLE ;
			break ;
		case stDATA :
			if ( c != 0 ) {
				fprintf( outfile, "\t.BYT\t0x%.2X, 0x%.2X\t; 0x%.5X\n", c & 0xFF, ( c >> 8 ) & 0xFF, c ) ;
				pc += 1 ;
			} else
				state = stIDLE ;
			break ;
		}
	}
	fclose( outfile ) ;
	return true ;
}
 
int main( int argc, char *argv[] ) {
	char mem_filename[ 256 ] = { '\0' } ;
	char psm_filename[ 256 ] = { '\0' } ;
 
	bool bOptErr = false ;
	bool bKCPSM6 = false ;
	bool bVerbose = false ;
 
	extern char * optarg ;
	extern int optind, optopt, opterr ;
	int optch ;
 
	opterr = -1 ;
	while ( ( optch = getopt( argc, argv, "hv6" ) ) != -1 ) {
		switch ( optch ) {
		case 'h' :
			bOptErr = true ;
			break ;
		case '6' :
			bKCPSM6 = true ;
			break ;
		case 'v' :
			bVerbose = true ;
			break ;
		default :
			fprintf( stderr, "? unknown option: -%c\n", optopt ) ;
			bOptErr = true ;
			break ;
		}
	}
 
	if ( bOptErr ) {
		usage( basename( argv[ 0 ] ) ) ;
		exit( -1 ) ;
	}
 
	// source filename
	if ( argv[ optind ] == NULL ) {
		fprintf( stderr, "? source file missing\n" ) ;
		usage( basename( argv[ 0 ] ) ) ;
		exit( -1 ) ;
	}
	strcpy( mem_filename, argv[ optind++ ] ) ;
	if ( strrchr( mem_filename, '.' ) == NULL )
		strcat( mem_filename, ".mem" ) ;
	if ( bVerbose )
		printf( "! MEM file: %s\n", mem_filename ) ;
 
	// output filename
	if ( argv[ optind ] == NULL ) {
		strcpy( psm_filename, filename( mem_filename ) ) ;
	} else {
		strcpy( psm_filename, argv[ optind++ ] ) ;
	}
	if ( strrchr( psm_filename, '.' ) == NULL )
		strcat( psm_filename, ".psm" ) ;
	if ( bVerbose )
		printf( "! output file: %s\n", psm_filename ) ;
 
	if ( loadMEM( mem_filename ) ) {
		if ( bKCPSM6 )
			writePSM6( psm_filename ) ;
		else
			writePSM3( psm_filename ) ;
		exit( 0 ) ;
	} else
		exit( -2 ) ;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.