
u8 *dissassemble(u32 op)
{
	static u8 buf[20];
	static const u8 *nemo[8]={"LD  ","AND ","OR  ","XOR ","ADD ","SUB ","ST  ","B"};
	static const u8 *cc[8]={"","GT ","LT ","NE ","EQ ","GE ","LE ","RA "};
	u32 ins, mode, src,d;
	u8 *p;

	d=op>>8;
	op&=0xff;
	ins=(op>>5);
	mode=(op>>2)&7;
	src=op&3;

	//printf ("ins=%X mode=%X src=%X ",ins,mode, src);

	p=buf;

	// NOPs
	if ((op&0xF3)==2 ||						// LD  AC,AC
		(op&0xF3)==((1<<5)|2) || 			// AND AC,AC
		(op&0xF3)==((2<<5)|2) || 			// OR  AC,AC
		((op&0xF3)==(1<<5) && d==0xff) ||	// AND $FF
		((op&0xF3)==(2<<5) && d==0x00) ||	// OR  $00
		((op&0xF3)==(3<<5) && d==0x00) ||	// XOR $00
		((op&0xF3)==(4<<5) && d==0x00) ||	// ADD $00
		((op&0xF3)==(5<<5) && d==0x00)		// SUB $00
	) {strcpy(p,"NOP"); return buf;}
	// Mnemonic
	if((op>>2)==(7<<3)) strcpy(p,"JMP Y,");
	else strcpy(p,nemo[ins]);
	while(*p) p++;
	if (ins==7) {
		strcpy(p,cc[mode]); while(*p) p++;
	}

	// Operands
	if (ins==7) {	// Bcc/JMP
		switch(src) {
		case 0:	_sprintf(p,"$%02x",d); break;
		case 1: _sprintf(p,"[$%02x]",d);	break;
		case 2:	strcpy(p,"AC");	break;
		case 3:	strcpy(p,"IN"); break;
		}

	}else if (ins!=6) {	// not Bcc nor ST
		switch(src) {
		case 0:	_sprintf(p,"$%02x",d); break;			// src: D
		case 1:											// src: RAM
			switch(mode){
			case 0:	_sprintf(p,"[$%02x],AC",d);	break;
			case 1:	_sprintf(p,"[X],AC");		break;
			case 2:	_sprintf(p,"[Y,$%02x],AC",d);	break;
			case 3:	_sprintf(p,"[Y,X],AC");	break;
		
			case 4:	_sprintf(p,"[$%02x],X",d);	break;
			case 5:	_sprintf(p,"[$%02x],Y",d);	break;
			case 6:	_sprintf(p,"[$%02x],OUT",d);	break;
			case 7:	_sprintf(p,"[Y,X++],OUT");	break;
			}
			break;
		case 2:	strcpy(p,"AC");	break;					// src: AC
		case 3:	strcpy(p,"IN"); break;					// src: IN
		}
		if(src!=1) {
			while(*p) p++;
			switch (mode) { // Result stored in...
			default: strcpy(p,",AC");	break;
			case 4: strcpy(p,",X");	break;
			case 5: strcpy(p,",Y");	break;
			case 6: strcpy(p,",OUT"); break;
			case 7: strcpy(p,",OUT,X++"); break;
			}
		}
	} else {	// ST
		switch(src) {
		case 0:	_sprintf(p,"$%02x,",d); break;	// src: D
		case 1: strcpy(p,"undef,");	break;		// src: RAM (bus floating)
		case 2:	strcpy(p,"AC,"); break;			// src: AC
		case 3:	strcpy(p,"IN,"); break;			// src: IN
		}
		while(*p) p++;
		switch(mode){
		case 0:	_sprintf(p,"[$%02x]",d);	break;
		case 1:	_sprintf(p,"[X]");		break;
		case 2:	_sprintf(p,"[Y,$%02x]",d);	break;
		case 3:	_sprintf(p,"[Y,X]");	break;
		case 4:	_sprintf(p,"[$%02x],X",d);	break;
		case 5:	_sprintf(p,"[$%02x],Y",d);	break;
		case 6:	_sprintf(p,"[$%02x]",d);	break;
		case 7:	_sprintf(p,"[Y,X++]");	break;
		}

	}
	return buf;
}


