All pastes #758212 Raw Edit

Stuff

public text v1 · immutable
·published 2007-11-02 00:17 UTC
rendered paste body
/*

Program originally written by xvi (xvi91@hotmail.com)
You can use this program freely, I don't hold any copyright on it!
This program was written with compatibility in mind, it should compile and run
on most platforms, Mac, PC, Unix. I did test it on Mac and Digital Unix.
All I ask is that you mail me the modifications if you make some correction.

History:

18-NOV-2000	Corrected BSET/BCLR ($xxxx)y disassembly.
25-MAY-2001	Added ascii dump (chris).

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define HEADER 0 // 0- no header, 1- 8184 header, 2- PD-2 LF-Dxxx header & D3xx, 3- PD-2 LF-D2xx header
				 //	4- 8186 header

#if HEADER==0
unsigned long ROMOFFSET;
#elif HEADER==1
unsigned long ROMOFFSET=0x81800;
#elif HEADER==2
unsigned long ROMOFFSET=0x84000;
#elif HEADER==3
unsigned long ROMOFFSET=0x88000;
#elif HEADER==4
unsigned long ROMOFFSET=0x80c00;
#endif

char *ra[4]={"A0","A1","A2","A3"};
char *rd[4]={"D0","D1","D2","D3"};
char operb[256];
char argsb[256];
char *oper;
char *args;
char line[256];
char rupt;

unsigned char n1,n2;
unsigned char b1;

unsigned char rom[512*1024];
unsigned long pc;


#define m (b1 & 3)
#define n ((b1>>2) & 3)
#define i ((b1>>4) & 3)
#define Am (ra[m])
#define Dm (rd[m])
#define An (ra[n])
#define Dn (rd[n])
#define Ai (ra[i])
#define Di (rd[i])

void exth(void)
{
b1 = rom[pc+2];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0xc:
		oper = (n2 < 8) ? (char*)"TBZ" : (char*)"TBNZ";
		sprintf(args,"($%02hX%02hX%02hX)%hd,$%08lX",(short) rom [pc+5],(short) rom [pc+4],(short) rom [pc+3],n2&7,pc+ROMOFFSET+7+(signed char) rom[pc+6]);
		pc = pc+7;
		break;
	case 0xd:
		oper = (n2 < 8) ? (char*)"BSET" : (char*)"BCLR";
		sprintf(args,"($%02hX%02hX%02hX)%hd",(short) rom [pc+5],(short) rom [pc+4],(short) rom [pc+3],n2&7);
		pc = pc+6;
		break;
	}
}

void exti(void)
{
b1 = rom[pc+2];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x8:
		oper = "TBZ";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom [pc+3],ra[(n&8)?3:2],n2&7,pc+ROMOFFSET+5+(signed char) rom [pc+4]);
		pc += 5;
		break;
	case 0x9:
		oper = "BSET";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom [pc+3],ra[(n&8)?3:2],n2&7);
		pc += 4;
		break;
	case 0xa:
		oper = "TBNZ";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom [pc+3],ra[(n&8)?3:2],n2&7,pc+ROMOFFSET+5+(signed char) rom [pc+4]);
		pc += 5;
		break;
	case 0xb:
		oper = "BLCR";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom [pc+3],ra[(n&8)?3:2],n2&7);
		pc += 4;
		break;
	}
}

void extj(void)
{
b1 = rom[pc+2];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

if (b1 > 1) return;
oper = (b1==0)?(char*)"MULQL":(char*)"MULQH";
b1 = rom[pc+1];
sprintf(args,"%s,%s",Dn,Dm);
pc += 3;
}

void extk(void)
{
b1 = rom[pc+2];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

if (b1 != 0x10) return;
oper = "MULQ";
b1 = rom[pc+1];
sprintf(args,"%s,%s",Dn,Dm);
pc += 3;
}

void extl(void)
{
b1 = rom[pc+2];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch(b1)
	{
	case 0x04:
		oper = "MULQL";
		b1 = rom[pc+1];
		sprintf(args,"$%02hX,%s",(short) rom[pc+3],Dm);
		pc += 4;
		break;
	case 0x05:
		oper = "MULQH";
		b1 = rom[pc+1];
		sprintf(args,"$%02hX,%s",(short) rom[pc+3],Dm);
		pc += 4;
		break;
	case 0x08:
		oper = "MULQL";
		b1 = rom[pc+1];
		sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],Dm);
		pc += 5;
		break;
	case 0x09:
		oper = "MULQH";
		b1 = rom[pc+1];
		sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],Dm);
		pc += 5;
		break;
	}
}

void exta(void)
{
b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
		if (n2 & 2) return;
		if (n2 & 1)
			{
			oper = "JSR";
			} else
			{
			oper = "JMP";
			rupt = 1;
			}
		sprintf(args,"(%s)",An);
		pc += 2;
		break;
	case 0x2:
		oper = "BSET";
		sprintf(args,"%s,(%s)",Dm,An);
		pc += 2;
		break;
	case 0x3:
		oper = "BCLR";
		sprintf(args,"%s,(%s)",Dm,An);
		pc += 2;
		break;
	case 0x4:
	case 0x5:
	case 0x6:
	case 0x7:
		oper = "MOVB";
		sprintf(args,"(%s,%s),%s",Di,An,Dm);
		pc += 2;
		break;
	case 0x8:
	case 0x9:
	case 0xa:
	case 0xb:
		oper = "MOVBU";
		sprintf(args,"(%s,%s),%s",Di,An,Dm);
		pc += 2;
		break;
	case 0xc:
	case 0xd:
	case 0xe:
	case 0xf:
		oper = "MOVB";
		sprintf(args,"%s,(%s,%s)",Dm,Di,An);
		pc += 2;
		break;
	}
}

void extb(void)
{
b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
	case 0x1:
	case 0x2:
	case 0x3:
		oper = "MOV";
		sprintf(args,"(%s,%s),%s",Di,An,Am);
		pc += 2;
		break;
	case 0x4:
	case 0x5:
	case 0x6:
	case 0x7:
		oper = "MOV";
		sprintf(args,"(%s,%s),%s",Di,An,Dm);
		pc += 2;
		break;
	case 0x8:
	case 0x9:
	case 0xa:
	case 0xb:
		oper = "MOV";
		sprintf(args,"%s,(%s,%s)",Am,Di,An);
		pc += 2;
		break;
	case 0xc:
	case 0xd:
	case 0xe:
	case 0xf:
		oper = "MOV";
		sprintf(args,"%s,(%s,%s)",Dm,Di,An);
		pc += 2;
		break;
	}
}

void extc(void)
{
char *op1[16] = {"ADD","SUB","CMP","MOV","ADD","SUB","CMP","MOV","ADDC","SUBC","","","ADD","SUB","CMP","MOV"};

b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

if ( (n1 == 0xa) || (n1 == 0xb) ) return;
oper = op1[n1];

switch (n1)
	{
	case 0x0:
	case 0x1:
	case 0x2:
	case 0x3:
		sprintf(args,"%s,%s",Dn,Am);
		break;
	case 0x4:
	case 0x5:
	case 0x6:
	case 0x7:
		sprintf(args,"%s,%s",An,Am);
		break;
	case 0x8:
	case 0x9:
		sprintf(args,"%s,%s",Dn,Dm);
		break;
	case 0xc:
	case 0xd:
	case 0xe:
	case 0xf:
		sprintf(args,"%s,%s",An,Dm);
		break;
	}
pc += 2;
}

void extd(void)
{
char *op1[10]={"AND","OR","XOR","","MUL","MULU","DIVU","","","CMP"};
char *op2[4]={"ROL","ROR","ASR","LSR"};

b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
	case 0x1:
	case 0x2:
	case 0x4:
	case 0x5:
	case 0x6:
	case 0x9:
		oper = op1[n1];
		sprintf(args,"%s,%s",Dn,Dm);
		pc += 2;
		break;
	case 0x3:
		oper = op2[n];
		sprintf(args,"%s",Dm);
		pc += 2;
		break;
	case 0xc:
		switch(m)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"%s,MDR",Dn);
				pc += 2;
				break;
			case 1:
				oper = "EXT";
				sprintf(args,"%s",Dn);
				pc += 2;
				break;
			case 2:
			case 3:
				return;
			}
		break;
	case 0xd:
		switch(m)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"%s,PSW",Dn);
				pc += 2;
				break;
			default:
				return;
			}
		break;
	case 0xe:
		switch(n)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"MDR,%s",Dm);
				pc += 2;
				break;
			case 1:
				oper = "NOT";
				sprintf(args,"%s",Dm);
				pc += 2;
				break;
			}
		break;
	case 0xf:
		switch(n)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"PSW,%s",Dm);
				pc += 2;
				break;
			case 3:
				switch(m)
					{
					case 0:
						oper = "PXST";
						pc += 2;
						break;
					case 2:
						exth();
						break;
					case 3:
						exti();
						break;
					}
				break;
			}
		break;
	}
}

void exte(void)
{
long d24;
b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX%02hX,%s)",Dm,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 5;
		break;
	case 0x1:
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX%02hX,%s)",Am,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 5;
		break;
	case 0x2:
		oper = "MOVB";
		sprintf(args,"%s,($%02hX%02hX%02hX,%s)",Dm,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 5;
		break;
	case 0x3:
		oper = "MOVX";
		sprintf(args,"%s,($%02hX%02hX%02hX,%s)",Dm,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 5;
		break;
	case 0x4:
		switch(n)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"%s,($%02hX%02hX%02hX)",Dm,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
				pc += 5;
				break;
			case 1:
				oper = "MOVB";
				sprintf(args,"%s,($%02hX%02hX%02hX)",Dm,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
				pc += 5;
				break;
			case 2:
				if (m != 3) return;
				oper = "BSET";
				sprintf(args,"$%02hX,($%02hX%02hX%02hX)",(short) rom[pc+5],(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
				pc += 6;
				break;
			case 3:
				if (m != 3) return;
				oper = "BCLR";
				sprintf(args,"$%02hX,($%02hX%02hX%02hX)",(short) rom[pc+5],(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
				pc += 6;
				break;
			}
		break;
	case 0x5:
		if (n != 0) return;
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX%02hX)",Am,(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
		pc += 5;
		break;
	case 0x6:
		switch(n)
			{
			case 0:
				oper = "ADD";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 1:
				oper = "ADD";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			case 2:
				oper = "SUB";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 3:
				oper = "SUB";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			}
		break;
	case 0x7:
		switch(n)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 1:
				oper = "MOV";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			case 2:
				oper = "CMP";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 3:
				oper = "CMP";
				sprintf(args,"$%02hX%02hX%02hX,%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			}
		break;
	case 0x8:
		oper = "MOV";
		sprintf(args,"($%02hX%02hX%02hX,%s),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 5;
		break;
	case 0x9:
		oper = "MOVBU";
		sprintf(args,"($%02hX%02hX%02hX,%s),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 5;
		break;
	case 0xa:
		oper = "MOVB";
		sprintf(args,"($%02hX%02hX%02hX,%s),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 5;
		break;
	case 0xb:
		oper = "MOVX";
		sprintf(args,"($%02hX%02hX%02hX,%s),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 5;
		break;
	case 0xc:
		switch(n)
			{
			case 0:
				oper = "MOV";
				sprintf(args,"($%02hX%02hX%02hX),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 1:
				oper = "MOVB";
				sprintf(args,"($%02hX%02hX%02hX),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			case 2:
				oper = "MOVBU";
				sprintf(args,"($%02hX%02hX%02hX),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 5;
				break;
			}
		break;
	case 0xd:
		if (n != 0) return;
		oper = "MOV";
		sprintf(args,"($%02hX%02hX%02hX),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],Am);
		pc += 5;
		break;
	case 0xe:
		switch(n)
			{
			case 0:
				switch(m)
					{
					case 0:
						oper = "JMP";
						rupt = 1;
						d24 = ((unsigned long) rom[pc+4]) * 0x10000 + ((unsigned long) rom[pc+3]) * 0x100 + ((unsigned long) rom[pc+2]);
						sprintf(args,"$%08lX",(pc+ROMOFFSET+5+d24) & 0xffffff);
						pc += 5;
						break;
					case 1:
						oper = "JSR";
						d24 = ((unsigned long) rom[pc+4]) * 0x10000 + ((unsigned long) rom[pc+3]) * 0x100 + ((unsigned long) rom[pc+2]);
						sprintf(args,"$%08lX",(pc+ROMOFFSET+5+d24) & 0xffffff);
						pc += 5;
						break;
					case 3:
						oper = "BSET";
						sprintf(args,"$%02hX,($%02hX%02hX)",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
						pc += 5;
						break;
					}
				break;
			case 1:
				if (m != 3) return;
				oper = "BCLR";
				sprintf(args,"$%02hX,($%02hX%02hX)",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2]);
				pc += 5;
				break;
			case 2:
				oper = "BSET";
				sprintf(args,"$%02hX,($%02hX,%s)",(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			case 3:
				oper = "BCLR";
				sprintf(args,"$%02hX,($%02hX,%s)",(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 5;
				break;
			}
		break;
	case 0xf:
		oper = "MOV";
		sprintf(args,"($%02hX%02hX%02hX,%s),%s",(short) rom[pc+4],(short) rom[pc+3],(short) rom[pc+2],An,Am);
		pc += 5;
		break;
	}
}

void extf(void)
{
char *op1[16] = {"BLTX","BGTX","BGEX","BLEX","BCSX","BHIX","BCCX","BLSX","BEQX","BNEX","","","BVCX","BVSX","BNCX","BNSX"};
char *op2[4] =  {"BVC","BVS","BNC","BNS"};
b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
		switch(n)
			{
			case 0:
				oper = "AND";
				sprintf(args,"$%02hX,%s",(short) rom[pc+2],Dm);
				pc += 3;
				break;
			case 1:
				oper = "BTST";
				sprintf(args,"$%02hX,%s",(short) rom[pc+2],Dm);
				pc += 3;
				break;
			case 2:
				oper = "OR";
				sprintf(args,"$%02hX,%s",(short) rom[pc+2],Dm);
				pc += 3;
				break;
			case 3:
				oper = "ADDNF";
				sprintf(args,"$%02hX,%s",(short) rom[pc+2],Am);
				pc += 3;
				break;
			}
		break;
	case 0x1:
		oper = "MOVB";
		sprintf(args,"%s,($%02hX,%s)",Dm,(short) rom[pc+2],An);
		pc += 3;
		break;
	case 0x2:
		oper = "MOVB";
		sprintf(args,"($%02hX,%s),%s",(short) rom[pc+2],An,Dm);
		pc += 3;
		break;
	case 0x3:
		oper = "MOVBU";
		sprintf(args,"($%02hX,%s),%s",(short) rom[pc+2],An,Dm);
		pc += 3;
		break;
	case 0x4:
		extj();
		break;
	case 0x5:
		oper = "MOVX";
		sprintf(args,"%s,($%02hX,%s)",Dm,(short) rom[pc+2],An);
		pc += 3;
		break;
	case 0x6:
		extk();
		break;
	case 0x7:
		oper = "MOVX";
		sprintf(args,"($%02hX,%s),%s",(short) rom[pc+2],An,Dm);
		pc += 3;
		break;
	case 0x8:
		oper = "TBZ";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom[pc+2],ra[(n2 & 8) ? 1 : 0],n2 & 7,pc+ROMOFFSET+4+(signed char) rom[pc+3]);
		pc += 4;
		break;
	case 0x9:
		oper = "BSET";
		sprintf(args,"($%02hX,%s)%hd",(short) rom[pc+2],ra[(n2 & 8) ? 1 : 0],n2 & 7);
		pc += 3;
		break;
	case 0xa:
		oper = "TBNZ";
		sprintf(args,"($%02hX,%s)%hd,$%08lX",(short) rom[pc+2],ra[(n2 & 8) ? 1 : 0],n2 & 7,pc+ROMOFFSET+4+(signed char) rom[pc+3]);
		pc += 4;
		break;
	case 0xb:
		oper = "BCLR";
		sprintf(args,"($%02hX,%s)%hd",(short) rom[pc+2],ra[(n2 & 8) ? 1 : 0],n2 & 7);
		pc += 3;
		break;
	case 0xc:
		switch(n)
			{
			case 0:
			case 1:
				oper = "TBZ";
				sprintf(args,"($%02hX%02hX)%hd,$%08lX",(short) rom[pc+3],(short) rom[pc+2],n2 & 7,pc+ROMOFFSET+5+(signed char) rom[pc+4]);
				pc += 5;
				break;
			case 2:
			case 3:
				oper = "TBNZ";
				sprintf(args,"($%02hX%02hX)%hd,$%08lX",(short) rom[pc+3],(short) rom[pc+2],n2 & 7,pc+ROMOFFSET+5+(signed char) rom[pc+4]);
				pc += 5;
				break;
			}
		break;
	case 0xd:
		switch(n)
			{
			case 0:
			case 1:
				oper = "BSET";
				sprintf(args,"($%02hX%02hX)%hd",(short) rom[pc+3],(short) rom[pc+2],n2 & 7);
				pc += 4;
				break;
			case 2:
			case 3:
				oper = "BCLR";
				sprintf(args,"($%02hX%02hX)%hd",(short) rom[pc+3],(short) rom[pc+2],n2 & 7);
				pc += 4;
				break;
			}
		break;
	case 0xe:
		if ( (n2 == 0xa) || (n2 == 0xb) ) return;
		oper = op1[n2];
		sprintf(args,"$%08lX",pc+ROMOFFSET+3+(signed char) rom[pc+2]);
		pc += 3;
		break;
	case 0xf:
		if (n2 < 8)
			{
			extl();
			return;
			}
		if (n2 < 12) return;
		oper = op2[n2-12];
		sprintf(args,"$%08lX",pc+ROMOFFSET+3+(signed char) rom[pc+2]);
		pc += 3;
		break;
	}
}

void extg(void)
{
b1 = rom[pc+1];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch (n1)
	{
	case 0x0:
		switch(n)
			{
			case 0:
				oper = "AND";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			case 1:
				oper = "BTST";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			case 2:
				oper = "ADD";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 4;
				break;
			case 3:
				oper = "SUB";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Am);
				pc += 4;
				break;
			}
		break;
	case 0x1:
		switch(n)
			{
			case 0:
				if (m != 0) return;
				oper = "AND";
				sprintf(args,"$%02hX%02hX,PSW",(short) rom[pc+3],(short) rom[pc+2]);
				pc += 4;
				break;
			case 1:
				if (m != 0) return;
				oper = "OR";
				sprintf(args,"$%02hX%02hX,PSW",(short) rom[pc+3],(short) rom[pc+2]);
				pc += 4;
				break;
			case 2:
				oper = "ADD";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			case 3:
				oper = "SUB";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			}
		break;
	case 0x2:
		if (n != 0) return;
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX)",Am,(short) rom[pc+3],(short) rom[pc+2]);
		pc += 4;
		break;
	case 0x3:
		if (n != 0) return;
		oper = "MOV";
		sprintf(args,"($%02hX%02hX),%s",(short) rom[pc+3],(short) rom[pc+2],Am);
		pc += 4;
		break;
	case 0x4:
		switch(n)
			{
			case 0:
				oper = "OR";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			case 2:
				oper = "CMP";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			case 3:
				oper = "XOR";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+3],(short) rom[pc+2],Dm);
				pc += 4;
				break;
			}
		break;
	case 0x5:
		oper = "MOVBU";
		sprintf(args,"($%02hX%02hX,%s),%s",(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 4;
		break;
	case 0x6:
		oper = "MOVX";
		sprintf(args,"%s,($%02hX%02hX,%s)",Dm,(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 4;
		break;
	case 0x7:
		oper = "MOVX";
		sprintf(args,"($%02hX%02hX,%s),%s",(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 4;
		break;
	case 0x8:
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX,%s)",Dm,(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 4;
		break;
	case 0x9:
		oper = "MOVB";
		sprintf(args,"%s,($%02hX%02hX,%s)",Dm,(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 4;
		break;
	case 0xa:
		oper = "MOV";
		sprintf(args,"%s,($%02hX%02hX,%s)",Am,(short) rom[pc+3],(short) rom[pc+2],An);
		pc += 4;
		break;
	case 0xb:
		oper = "MOV";
		sprintf(args,"($%02hX%02hX,%s),%s",(short) rom[pc+3],(short) rom[pc+2],An,Am);
		pc += 4;
		break;
	case 0xc:
		oper = "MOV";
		sprintf(args,"($%02hX%02hX,%s),%s",(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 4;
		break;
	case 0xd:
		oper = "MOVB";
		sprintf(args,"($%02hX%02hX,%s),%s",(short) rom[pc+3],(short) rom[pc+2],An,Dm);
		pc += 4;
		break;
	}
}

void dodis(void)
{
// do the real disassembly.
// if rom[pc] is not an instruction, do nothing, do NOT increment pc.
// if pc is incremented, oper and args are the instruction description

char *op1[4]={"EXTX","EXTXU","EXTXB","EXTXBU"};
char *op2[4]={"MOV","MOVB","MOV","MOVBU"};
char *op3[4]={"ADD","ADD","CMP","MOV"};
char *op4[16]={"BLT","BGT","BGE","BLE","BCS","BHI","BCC","BLS","BEQ","BNE","BRA","RTI","CMP","CMP","CMP","CMP"};


rupt = 0;

b1 = rom[pc];
n1 = (b1 >> 4) & 0xF;
n2 = (b1) & 0xF;

switch(n1)
	{
	case 0x0:
		oper = "MOV";
		sprintf(args,"%s,(%s)",Dm,An);
		pc++;
		break;
	case 0x1:
		oper = "MOVB";
		sprintf(args,"%s,(%s)",Dm,An);
		pc++;
		break;
	case 0x2:
		oper = "MOV";
		sprintf(args,"(%s),%s",An,Dm);
		pc++;
		break;
	case 0x3:
		oper = "MOVBU";
		sprintf(args,"(%s),%s",An,Dm);
		pc++;
		break;
	case 0x4:
		oper = "MOV";
		sprintf(args,"%s,($%02hX,%s)",Dm,(short) rom[pc+1],An);
		pc+=2;
		break;
	case 0x5:
		oper = "MOV";
		if (rom[pc+1] == 0)
			sprintf(args,"%s,(%s)",Am,An);
			else
			sprintf(args,"%s,($%02hX,%s)",Am,(short) rom[pc+1],An);
		pc+=2;
		break;
	case 0x6:
		oper = "MOV";
		sprintf(args,"($%02hX,%s),%s",(short) rom[pc+1],An,Dm);
		pc+=2;
		break;
	case 0x7:
		oper = "MOV";
		if (rom[pc+1] == 0)
			sprintf(args,"(%s),%s",An,Am);
			else
			sprintf(args,"($%02hX,%s),%s",(short) rom[pc+1],An,Am);
		pc+=2;
		break;
	case 0x8:
		if ( m == n )
			{
			oper = "MOV";
			sprintf(args,"$%02hX,%s\t\t\t;'%c'",(short) rom[pc+1],Dm, isprint(rom[pc+1])?(rom[pc+1]):'?');
			pc += 2;
			}
			else
			{
			oper = "MOV";
			sprintf(args,"%s,%s",Dn,Dm);
			pc++;
			}
		break;
	case 0x9:
		oper = "ADD";
		sprintf(args,"%s,%s",Dn,Dm);
		pc++;
		break;
	case 0xa:
		oper = "SUB";
		sprintf(args,"%s,%s",Dn,Dm);
		pc++;
		break;
	case 0xb:
		oper = op1[n];
		sprintf(args,"%s",Dm);
		pc++;
		break;
	case 0xc:
		oper = op2[n];
		if (n < 2)
			sprintf(args,"%s,($%02hX%02hX)",Dm,(short) rom[pc+2],(short) rom[pc+1]);
			else
			sprintf(args,"($%02hX%02hX),%s",(short) rom[pc+2],(short) rom[pc+1],Dm);
		pc += 3;
		break;
	case 0xd:
		oper = op3[n];
		switch(n)
			{
			case 0:
				sprintf(args,"$%02hX,%s",(short) rom[pc+1],Am);
				pc += 2;
				break;
			case 1:
			case 2:
				sprintf(args,"$%02hX,%s\t\t\t;'%c'",(short) rom[pc+1],Dm,isprint(rom[pc+1])?(rom[pc+1]):('?'));
				pc += 2;
				break;
			case 3:
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+2],(short) rom[pc+1],Am);
				pc += 3;
				break;
			}
		break;
	case 0xe:
		oper = op4[n2];
		if (n2 == 0xa) rupt = 1;
		if (n2 == 0xb) rupt = 2;
		switch(n2)
			{
			case 0xb:
				pc++;
				break;
			case 0xc:
			case 0xd:
			case 0xe:
			case 0xf:
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+2],(short) rom[pc+1],Am);
				pc += 3;
				break;
			default:
				sprintf(args,"$%08lX",pc+ROMOFFSET+2+(signed char) (rom[pc+1]) );
				pc += 2;
				break;
			}
		break;
	case 0xf:
		switch(n2)
			{
			case 0x0:
				exta();
				break;
			case 0x1:
				extb();
				break;
			case 0x2:
				extc();
				break;
			case 0x3:
				extd();
				break;
			case 0x4:
				exte();
				break;
			case 0x5:
				extf();
				break;
			case 0x6:
				oper = "NOP";
				pc++;
				break;
			case 0x7:
				extg();
				break;
			case 0x8:
			case 0x9:
			case 0xa:
			case 0xb:
				oper = "MOV";
				sprintf(args,"$%02hX%02hX,%s",(short) rom[pc+2],(short) rom[pc+1],Dm);
				pc += 3;
				break;
			case 0xc:
				oper = "JMP";
				rupt = 1;
				sprintf(args,"$%08lX",pc+ROMOFFSET+3+((short) (rom[pc+2]*256+rom[pc+1])));
				pc += 3;
				break;
			case 0xd:
				oper = "JSR";
				sprintf(args,"$%08lX",pc+ROMOFFSET+3+((short) (rom[pc+2]*256+rom[pc+1])));
				pc += 3;
				break;
			case 0xe:
				oper = "RTS";
				rupt = 2;
				pc++;
				break;
			}
		break;
	}
}

void dis(void)
{
unsigned long oldpc;
char cdump[256];
char ddump[256];
char cbyte[16];
int ptr;

strcpy(operb,"");
strcpy(argsb,"");
oper = operb;
args = argsb;

oldpc = pc;

dodis();

if (pc == oldpc)
	{
	oper = "DC.B";
	sprintf(args,"$%02hX",(short) rom[pc++]);
	}
strcpy(cdump,"");
for (ptr=oldpc; ptr<pc; ptr++)
	{
	sprintf(cbyte,"%02hX",(short) rom[ptr]);
	strcat(cdump,cbyte);
	}


// now add the dump of the characters :-)
strcpy(ddump,"");
for (ptr=oldpc; ptr<pc; ptr++)
	{
	sprintf(cbyte,"%c",isprint(rom[ptr])?(rom[ptr]):('?'));
	strcat(ddump,cbyte);
	}

sprintf(line,"%08lX %-12.12s\t%-12.12s\t%s\t%s",oldpc+ROMOFFSET,cdump,ddump,oper,args);
}


int main(void)
{
unsigned long len,l;
char fnam[256];
FILE *fin,*fout;


printf("File name : "); gets(fnam);
fin = fopen(fnam,"rb");
if (fin == NULL) return 0;

strcat(fnam,".txt");
fout = fopen(fnam,"w");
if (fout == NULL) return 0;

#if (HEADER==2) || (HEADER==3)
fread(rom,0x30,1,fin);
if (memcmp(rom,"MATSHITA",8))
	{
	fprintf(stderr,"Error: invalid file.\n");
	return;
	}
len = rom[0x24]*0x1000000 + rom[0x25]*0x10000 + rom[0x26]*0x100 + rom[0x27];

#elif HEADER==1
fread(rom,0x20,1,fin);
if (memcmp(rom,"MATSHITA SR8184 DOWNLOAD",24))
	{
	fprintf(stderr,"Error: invalid file.\n");
	return;
	}
len = rom[0x1c]*0x1000000 + rom[0x1d]*0x10000 + rom[0x1e]*0x100 + rom[0x1f];
#elif HEADER==4
fread(rom,0x20,1,fin);
if (memcmp(rom,"MATSHITA DV",11))
	{
	fprintf(stderr,"Error: invalid file.\n");
	return;
	}
len = rom[0x1c]*0x1000000 + rom[0x1d]*0x10000 + rom[0x1e]*0x100 + rom[0x1f];
#elif HEADER==0
len = sizeof(rom)/sizeof(rom[0]);
#endif
l = fread(rom,1,len,fin);
#if HEADER==0
len = l;
printf("Address of first byte of file (hex, e.g 80000, 81800 or 80c00): ");
scanf("%x",&ROMOFFSET);
#endif

for (pc=0; pc < len; )
	{
	dis();
	fprintf(fout,"%s\n",line);
	switch(rupt)
		{
		case 1:
			fprintf(fout,"\n");
			break;
		case 2:
			fprintf(fout,"---------------------------\n");
			fprintf(fout,"\n");
			break;
		}
	}
printf("Done.\n");
}