diff options
Diffstat (limited to 'sux.h')
| -rw-r--r-- | sux.h | 436 | 
1 files changed, 403 insertions, 33 deletions
| @@ -37,6 +37,15 @@ extern uint8_t end;  #define setflag(flag, bit) ((flag)) ? (cpu->ps.u8[thread] |= bit) : (cpu->ps.u8[thread] &= ~bit)  #define getflag(bit) (cpu->ps.u8[thread] & bit) +#define ORTHO_1CC(mne, cc) \ +	mne##_R##cc: case mne##_M##cc + +#define ORTHO_1OP(mne) \ +	mne##_R: case mne##_M + +#define ORTHO_2OP(mne) \ +	mne##_RR: case mne##_RM: case mne##_MR: case mne##_MM +  extern pthread_mutex_t mutex;  extern pthread_mutex_t main_mutex;  extern pthread_cond_t cond; @@ -44,7 +53,7 @@ extern pthread_cond_t main_cond;  #if debug  extern void print_regs(struct sux *cpu, uint8_t lines, uint8_t thread); -extern void disasm(struct sux *cpu, uint8_t lines, uint8_t opcode, uint8_t prefix, uint8_t ext_prefix, uint8_t prefix2, uint8_t thread); +extern void disasm(struct sux *cpu, uint8_t lines, uint8_t opcode, uint8_t prefix, uint8_t ext_prefix, uint8_t prefix2, uint8_t *op_type, uint8_t *op_id, uint8_t thread);  #endif  /*#define KEYBUF_SIZE 0x40 @@ -88,6 +97,23 @@ static /*inline*/ uint8_t get_addrsize(uint8_t prefix, uint8_t addrmode) {  	return 0xFF;  } +static /*inline*/ uint8_t get_ortho_addrsize(uint8_t prefix, uint8_t addrmode) { +	uint8_t type = IMM; +	switch (addrmode) { +		case MEM_ABS  : +		case MEM_ABSR : +		case MEM_AIND : +		case MEM_AINDR: +		case MEM_ARIND: type = ABS; break; +		case MEM_ZM   : +		case MEM_ZMR  : +		case MEM_IND  : +		case MEM_ZINDR: +		case MEM_ZRIND: type =  ZM; break; +	} +	return get_addrsize(prefix, type); +} +  static /*inline*/ uint8_t isrw(uint8_t opcode, uint8_t ext_prefix) {  	if ((ext_prefix & 0xD) == 0xD) {  		switch (ext_prefix >> 4) { @@ -480,12 +506,84 @@ static /*inline*/ uint64_t get_addr(struct sux *cpu, uint8_t opcode, uint8_t pre  	return address;  } +static /*inline*/ uint64_t get_ortho_addr(struct sux *cpu, uint8_t prefix, uint64_t address, operand *op, uint64_t *value, uint8_t *op_type, uint8_t *op_id, uint8_t inc_pc, uint8_t inc_clk, uint8_t thread) { +	for (int i = 0; i < 2; i++) { +		union reg tmp; +		tmp.u64 = 0; +		op[i].type = op_type[i]; +		op[i].id = op_id[i]; +		op[i].value = 0; +		op[i].rind[0] = 0xFF; +		op[i].rind[1] = 0xFF; +		if (op[i].type) { +			int inst_size = 0; +			int addr_size = get_ortho_addrsize(prefix, op[i].id); +			int rs = (1 << (prefix >> 4)); +			int is_rind = (op[i].id != MEM_ABS && op[i].id != MEM_ZM && op[i].id != MEM_AIND && op[i].id != MEM_IND && op[i].id != MEM_IMM); +			if (is_rind) { +				inst_size = (op[i].id == MEM_SIB)+1; +				tmp.u64 = read_value(cpu, 0, address, inst_size-1, 0, 0); +				if (inc_pc) { +					address += inst_size; +				} +				op[i].rind[0] = (tmp.u8[inst_size-1] & 0x0F); +				op[i].rind[1] = (tmp.u8[inst_size-1] >> 4); +				if (op[i].rind[1] == op[i].rind[0]) { +					op[i].rind[1] = 0xFF; +				} +				op[i].scale = (inst_size == 2) ? tmp.u8[0] : 0; +			} +			if (addr_size != 0xFF || (rs && op[i].id == MEM_IMM)) { +				inst_size = (addr_size != 0xFF) ? addr_size+1 : rs; +				op[i].value = read_value(cpu, 0, address, inst_size-1, inc_clk, 0); +				value[i] = op[i].value; +				if (inc_pc) { +					address += inst_size; +				} +			} +			if (is_rind) { +				for (int j = 0; j < 2 && op[i].rind[j] != 0xFF; j++) { +					uint64_t reg; +					switch (op[i].rind[j]) { +						case REG_A  : reg =   cpu->a;	break; +						case REG_B  : reg =   cpu->b;	break; +						case REG_X  : reg =   cpu->x;	break; +						case REG_Y  : reg =   cpu->y;	break; +						case REG_E  : reg =   cpu->e;	break; +						case REG_C  : reg =   cpu->c;	break; +						case REG_D  : reg =   cpu->d;	break; +						case REG_S  : reg =   cpu->s;	break; +						case REG_F  : reg =   cpu->f;	break; +						case REG_SP : reg =  cpu->sp;	break; +						case REG_BP : reg =  cpu->bp;	break; +						case REG_R11: reg = cpu->r11;	break; +						case REG_R12: reg = cpu->r12;	break; +						case REG_R13: reg = cpu->r13;	break; +						case REG_R14: reg = cpu->r14;	break; +						case REG_R15: reg = cpu->r15;	break; +					} +					value[i] += reg; +				} +				if (op[i].id == MEM_SIB) { +					value[i] *= op[i].scale+1; +				} +				#if getclk +				cpu->clk += inc_clk; +				#endif +			} +		} +	} +	return address; +} + -static /*inline*/ uint64_t adc(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t carry, uint8_t thread) { +static /*inline*/ uint64_t adc(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t carry, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	uint64_t sum = reg+value+carry;  	setflag(sum == 0, Z); -	setflag((sum >> 63), N); -	setflag(((reg^value) >> 63) && ((reg^sum) >> 63), V); +	setflag(sum >> (msb-1), N); +	setflag(((reg^value) >> (msb-1)) && ((reg^sum) >> (msb-1)), V);  	setflag((sum < value), C);  	return sum;  } @@ -507,22 +605,28 @@ static /*inline*/ uint64_t pull(struct sux *cpu, uint8_t size, uint8_t thread) {  	return value;  } -static /*inline*/ uint64_t and(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t thread) { +static /*inline*/ uint64_t and(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	reg &= value;  	setflag(reg == 0, Z); -	setflag(reg >> 63, N); +	setflag(reg >> (msb-1), N);  	return reg;  } -static /*inline*/ uint64_t or(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t thread) { +static /*inline*/ uint64_t or(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	reg |= value;  	setflag(reg == 0, Z); -	setflag(reg >> 63, N); +	setflag(reg >> (msb-1), N);  	return reg;  } -static /*inline*/ uint64_t xor(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t thread) { +static /*inline*/ uint64_t xor(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	reg ^= value;  	setflag(reg == 0, Z); -	setflag(reg >> 63, N); +	setflag(reg >> (msb-1), N);  	return reg;  } @@ -589,19 +693,23 @@ static /*inline*/ uint64_t ror(struct sux *cpu, uint64_t reg, uint64_t value, ui  	return sum;  } -static /*inline*/ uint64_t mul(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t thread) { +static /*inline*/ uint64_t mul(struct sux *cpu, uint64_t reg, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	uint64_t sum = reg*value;  	setflag(sum == 0, Z); -	setflag(sum >> 63, N); -	setflag(!((reg^value) >> 63) && ((reg^sum) >> 63), V); +	setflag(sum >> (msb-1), N); +	setflag(!((reg^value) >> (msb-1)) && ((reg^sum) >> (msb-1)), V);  	return sum;  } -static /*inline*/ uint64_t divd(struct sux *cpu, uint64_t reg, uint64_t value, uint64_t *rem, uint8_t thread) { +static /*inline*/ uint64_t divd(struct sux *cpu, uint64_t reg, uint64_t value, uint64_t *rem, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8;  	uint64_t sum = reg/value;  	*rem = reg % value;  	setflag(sum == 0, Z); -	setflag((sum >> 63), N); +	setflag(sum >> (msb-1), N);  	return sum;  } @@ -726,6 +834,264 @@ static /*inline*/ void store(struct sux *cpu, uint64_t address, uint64_t reg, ui  	write_value(cpu, reg, address, size, 1, 1);  } +static /*inline*/ uint64_t mov(struct sux *cpu, uint64_t src, uint64_t size, uint8_t thread) { +	size = (size > 7) ? 7 : size; +	uint8_t msb = (size+1)*8; +	uint64_t dst = 0; +	uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8)); +	if (size < 7) { +		dst = (dst & ~mask) | (src & mask); +	} else { +		dst = src; +	} +	setflag(dst == 0, Z); +	setflag(dst >> (msb-1), N); +	return dst; +} + +static /*inline*/ uint64_t set(struct sux *cpu, uint8_t flag, uint8_t thread) { +	return flag; +} + +static /*inline*/ uint64_t inc_dec(struct sux *cpu, uint64_t value, uint8_t size, uint8_t inc, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8; +	value += (inc) ? 1 : -1; +	setflag(value == 0, Z); +	setflag(value >> (msb-1), N); +	return value; +} + +static /*inline*/ uint64_t imul(struct sux *cpu, uint64_t dst, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8; +	int64_t sum = dst*value; +	setflag(sum == 0, Z); +	setflag(sum >> (msb-1), N); +	setflag(!((dst^value) >> (msb-1)) && ((dst^sum) >> (msb-1)), V); +	return sum; +} + +static /*inline*/ uint64_t idiv(struct sux *cpu, uint64_t dst, uint64_t value, uint64_t *rem, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8; +	int64_t sum = dst/value; +	*rem = dst % value; +	setflag(sum == 0, Z); +	setflag(sum >> (msb-1), N); +	return sum; +} + +static /*inline*/ uint64_t neg(struct sux *cpu, uint64_t value, uint8_t size, uint8_t thread) { +	size = (size > 8) ? 8 : size; +	uint8_t msb = size*8; +	value = -value; +	setflag(value == 0, Z); +	setflag(value >> (msb-1), N); +	return value; +} + +static /*inline*/ void exec_ortho_inst(struct sux *cpu, uint8_t opcode, uint8_t prefix, uint8_t size, uint8_t *op_type, uint8_t *op_id, uint8_t thread) { +	uint64_t dst = 0; +	uint64_t src = 0; +	uint64_t rem = 0; +	uint64_t address[2] = {0, 0}; +	int isdiv = 0; +	operand op[2]; +	cpu->pc = get_ortho_addr(cpu, prefix, cpu->pc, op, address, op_type, op_id, 1, 1, thread); +	if (op[1].type) { +		src = read_value(cpu, 0, op[1].value, size, 1, 1); +	} else { +		switch (op[1].id) { +			case REG_A  : src = cpu->a;	break; +			case REG_B  : src = cpu->b;	break; +			case REG_X  : src = cpu->x;	break; +			case REG_Y  : src = cpu->y;	break; +			case REG_E  : src = cpu->e;	break; +			case REG_C  : src = cpu->c;	break; +			case REG_D  : src = cpu->d;	break; +			case REG_S  : src = cpu->s;	break; +			case REG_F  : src = cpu->f;	break; +			case REG_SP : src = cpu->sp;	break; +			case REG_BP : src = cpu->bp;	break; +			case REG_R11: src = cpu->r11;	break; +			case REG_R12: src = cpu->r12;	break; +			case REG_R13: src = cpu->r13;	break; +			case REG_R14: src = cpu->r14;	break; +			case REG_R15: src = cpu->r15;	break; +		} +	} +	if (op[0].type) { +		dst = read_value(cpu, 0, op[0].value, size, 1, 1); +	} else { +		switch (op[0].id) { +			case REG_A  : dst = cpu->a;	break; +			case REG_B  : dst = cpu->b;	break; +			case REG_X  : dst = cpu->x;	break; +			case REG_Y  : dst = cpu->y;	break; +			case REG_E  : dst = cpu->e;	break; +			case REG_C  : dst = cpu->c;	break; +			case REG_D  : dst = cpu->d;	break; +			case REG_S  : dst = cpu->s;	break; +			case REG_F  : dst = cpu->f;	break; +			case REG_SP : dst = cpu->sp;	break; +			case REG_BP : dst = cpu->bp;	break; +			case REG_R11: dst = cpu->r11;	break; +			case REG_R12: dst = cpu->r12;	break; +			case REG_R13: dst = cpu->r13;	break; +			case REG_R14: dst = cpu->r14;	break; +			case REG_R15: dst = cpu->r15;	break; +		} +	} +	switch (opcode) { +		case ORTHO_2OP(MNG): +			if (getflag(N)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MPO): +			if (!getflag(N)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MCS): +			if (getflag(C)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MCC): +			if (!getflag(C)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MEQ): +			if (getflag(Z)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MNE): +			if (!getflag(Z)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MVS): +			if (getflag(V)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MVC): +			if (!getflag(V)) { +				dst = mov(cpu, src, size, thread); +			} +			break; +		case ORTHO_2OP(MOV): dst = mov(cpu, src, size, thread); break; +		case ORTHO_2OP(ADC): dst = adc(cpu, dst,  src, getflag(C), (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(SBC): dst = adc(cpu, dst, ~src, getflag(C), (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(ADD): dst = adc(cpu, dst,  src, 0, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(SUB): dst = adc(cpu, dst, ~src, 1, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(AND): dst = and(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(OR ): dst =  or(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(XOR): dst = xor(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(LSL): dst = lsl(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(LSR): dst = lsr(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(ROL): dst = rol(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(ROR): dst = ror(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(ASR): dst = asr(cpu, dst,  src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(MUL): dst = mul(cpu, dst, src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(DIV): dst = divd(cpu, dst, src, &rem, (op[0].type) ? size+1 : 8, thread); isdiv = 1; break; +		case ORTHO_2OP(CMP): adc(cpu, dst, ~src, 1, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(PCN): dst = popcnt(cpu, src, thread); break; +		case ORTHO_2OP(IML): dst = imul(cpu, dst, src, (op[0].type) ? size+1 : 8, thread); break; +		case ORTHO_2OP(IDV): dst = idiv(cpu, dst, src, &rem, (op[0].type) ? size+1 : 8, thread); isdiv = 1; break; +		case ORTHO_2OP(LEA): +			do { +				uint64_t address; +				uint64_t mask; +				if (op[1].type) { +					uint8_t addr_size = get_ortho_addrsize(prefix, op[1].id); +					size = (!size) ? addr_size : size; +					address = op[1].value; +				} else { +					address = src; +				} +				mask = (-(uint64_t)1 >> ((7 - size) * 8)); +				dst = (address & mask); +			} while (0); +			break; +		case ORTHO_1OP(PEA): +			do { +				uint64_t address = (op[0].type) ? op[0].value : dst; +				push(cpu, address, 7, thread); +			} while (0); +			break; +		case ORTHO_1OP(INC): dst = inc_dec(cpu, dst, size, 1, thread); break; +		case ORTHO_1OP(DEC): dst = inc_dec(cpu, dst, size, 0, thread); break; +		case ORTHO_1OP(PSH): push(cpu, dst, size, thread); break; +		case ORTHO_1OP(PUL): dst = pull(cpu, size, thread); break; +		case ORTHO_1OP(NOT): dst = ~dst; break; +		case ORTHO_1OP(CLZ): dst = lbcnt(cpu, src, 0, size, thread); break; +		case ORTHO_1OP(CLO): dst = lbcnt(cpu, src, 1, size, thread); break; +		case ORTHO_1OP(SWP): dst = swap(cpu, dst, size, thread); break; +		case ORTHO_1OP(NEG): dst = neg(cpu, dst, size, thread); break; +		case ORTHO_1CC(SET, NG): dst = set(cpu,  getflag(N), thread); break; +		case ORTHO_1CC(SET, PO): dst = set(cpu, !getflag(N), thread); break; +		case ORTHO_1CC(SET, CS): dst = set(cpu,  getflag(C), thread); break; +		case ORTHO_1CC(SET, CC): dst = set(cpu, !getflag(C), thread); break; +		case ORTHO_1CC(SET, EQ): dst = set(cpu,  getflag(Z), thread); break; +		case ORTHO_1CC(SET, NE): dst = set(cpu, !getflag(Z), thread); break; +		case ORTHO_1CC(SET, VS): dst = set(cpu,  getflag(V), thread); break; +		case ORTHO_1CC(SET, VC): dst = set(cpu, !getflag(V), thread); break; + +	} + +	if (op[0].type) { +		write_value(cpu, dst, op[0].value, size, 1, 1); +	} else { +		switch (op[0].id) { +			case REG_A  : cpu->a	= dst;	break; +			case REG_B  : cpu->b	= dst;	break; +			case REG_X  : cpu->x	= dst;	break; +			case REG_Y  : cpu->y	= dst;	break; +			case REG_E  : cpu->e	= dst;	break; +			case REG_C  : cpu->c	= dst;	break; +			case REG_D  : cpu->d	= dst;	break; +			case REG_S  : cpu->s	= dst;	break; +			case REG_F  : cpu->f	= dst;	break; +			case REG_SP : cpu->sp	= dst;	break; +			case REG_BP : cpu->bp	= dst;	break; +			case REG_R11: cpu->r11	= dst;	break; +			case REG_R12: cpu->r12	= dst;	break; +			case REG_R13: cpu->r13	= dst;	break; +			case REG_R14: cpu->r14	= dst;	break; +			case REG_R15: cpu->r15	= dst;	break; +		} +	} +	if (isdiv) { +		if (op[1].type) { +			write_value(cpu, rem, op[1].value, size, 1, 1); +		} else { +			switch (op[1].id) { +				case REG_A  : cpu->a	= rem;	break; +				case REG_B  : cpu->b	= rem;	break; +				case REG_X  : cpu->x	= rem;	break; +				case REG_Y  : cpu->y	= rem;	break; +				case REG_E  : cpu->e	= rem;	break; +				case REG_C  : cpu->c	= rem;	break; +				case REG_D  : cpu->d	= rem;	break; +				case REG_S  : cpu->s	= rem;	break; +				case REG_F  : cpu->f	= rem;	break; +				case REG_SP : cpu->sp	= rem;	break; +				case REG_BP : cpu->bp	= rem;	break; +				case REG_R11: cpu->r11	= rem;	break; +				case REG_R12: cpu->r12	= rem;	break; +				case REG_R13: cpu->r13	= rem;	break; +				case REG_R14: cpu->r14	= rem;	break; +				case REG_R15: cpu->r15	= rem;	break; +			} +		} +	} +} +  static /*inline*/ void exec_ext_inst(struct sux *cpu, uint8_t opcode, uint8_t prefix, uint64_t value, uint64_t address, uint8_t size, uint8_t thread) {  	uint8_t addr_size = get_addrsize(prefix, ext_optype[opcode]);  	uint8_t tmp = 0; @@ -767,35 +1133,35 @@ static /*inline*/ void exec_ext_inst(struct sux *cpu, uint8_t opcode, uint8_t pr  		case ADD_AB : /* ADD Absolute. */  		case ADD_Z  : /* ADD Zero Matrix. */  		case ADD_E  : /* ADD E Indirect. */ -			cpu->a = adc(cpu, cpu->a, value, 0, thread); +			cpu->a = adc(cpu, cpu->a, value, 0, 8, thread);  			break;  		case SUB_IMM: /* SUB Immediate. */  		case SUB_AB : /* SUB Absolute. */  		case SUB_Z  : /* SUB Zero Matrix. */  		case SUB_E  : /* SUB E Indirect. */ -			cpu->a = adc(cpu, cpu->a, ~value, 1, thread); +			cpu->a = adc(cpu, cpu->a, ~value, 1, 8, thread);  			break;  		case ADE_IMM: /* ADE Immediate. */  		case ADE_AB : /* ADE Absolute. */  		case ADE_Z  : /* ADE Zero Matrix. */ -			cpu->e = adc(cpu, cpu->e, value, 0, thread); +			cpu->e = adc(cpu, cpu->e, value, 0, 8, thread);  			break;  		case SBE_IMM: /* SBE Immediate. */  		case SBE_AB : /* SBE Absolute. */  		case SBE_Z  : /* SBE Zero Matrix. */ -			cpu->e = adc(cpu, cpu->e, ~value, 1, thread); +			cpu->e = adc(cpu, cpu->e, ~value, 1, 8, thread);  			break;  		case ADS_IMM: /* ADS Immediate. */  		case ADS_AB : /* ADS Absolute. */  		case ADS_Z  : /* ADS Zero Matrix. */  		case ADS_E  : /* ADS E Indirect. */ -			cpu->sp = adc(cpu, cpu->sp, value, 0, thread); +			cpu->sp = adc(cpu, cpu->sp, value, 0, 8, thread);  			break;  		case SBS_IMM: /* SBS Immediate. */  		case SBS_AB : /* SBS Absolute. */  		case SBS_Z  : /* SBS Zero Matrix. */  		case SBS_E  : /* SBS E Indirect. */ -			cpu->sp = adc(cpu, cpu->sp, ~value, 1, thread); +			cpu->sp = adc(cpu, cpu->sp, ~value, 1, 8, thread);  			break;  		case NOT_A : /* NOT Accumulator. */  			cpu->a = ~cpu->a; @@ -844,7 +1210,7 @@ static /*inline*/ void exec_ext_inst(struct sux *cpu, uint8_t opcode, uint8_t pr  		case CPE_IMM: /* CPE Immediate. */  		case CPE_AB : /* CPE Absolute. */  		case CPE_Z  : /* CPE Zero Matrix. */ -			adc(cpu, cpu->e, ~value, 1, thread); +			adc(cpu, cpu->e, ~value, 1, 8, thread);  			break;  		case ICE_AB : /* ICE Absolute. */  		case ICE_Z  : /* ICE Zero Matrix. */ @@ -1014,7 +1380,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case ADC_IMM:  /* ADC Immediate. */  		case ADC_AB: /* ADC Absolute. */  		case ADC_Z: /* ADC Zero Matrix. */ -			cpu->a = adc(cpu, cpu->a, value, getflag(C), thread); +			cpu->a = adc(cpu, cpu->a, value, 8, getflag(C), thread);  			break;  		case PHP_IMP: push(cpu, cpu->ps.u8[thread],    0, thread); break; /* PusH Processor status to stack. */  		case PHA_IMP: push(cpu, cpu->a            , size, thread); break; /* PusH Accumulator to stack. */ @@ -1042,7 +1408,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case SBC_IMM: /* SBC Immediate. */  		case SBC_AB: /* SBC Absolute. */  		case SBC_Z: /* SBC Zero Matrix. */ -			cpu->a = adc(cpu, cpu->a, ~value, getflag(C), thread); +			cpu->a = adc(cpu, cpu->a, ~value, 8, getflag(C), thread);  			break;  		case PLP_IMP: cpu->ps.u8[thread] = pull(cpu,    0, thread); break; /* PuLl Processor status from stack. */  		case PLA_IMP: cpu->a             = pull(cpu, size, thread); break; /* PuLl Accumulator from stack. */ @@ -1055,7 +1421,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case AND_IMM: /* AND Immediate. */  		case AND_AB: /* AND Absolute. */  		case AND_Z: /* AND Zero Matrix. */ -			cpu->a = and(cpu, cpu->a, value, thread); +			cpu->a = and(cpu, cpu->a, value, 8, thread);  			break;  		case BPO_REL: /* BPO Relative. */  			if (!getflag(N)) { @@ -1067,7 +1433,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case ORA_IMM: /* ORA Immediate. */  		case ORA_AB: /* ORA Absolute. */  		case ORA_Z: /* ORA Zero Matrix. */ -			cpu->a = or(cpu, cpu->a, value, thread); +			cpu->a = or(cpu, cpu->a, value, 8, thread);  			break;  		case SEI_IMP: /* SEt Interrupt. */  			setflag(1, I); @@ -1082,7 +1448,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case XOR_IMM: /* XOR Immediate. */  		case XOR_AB: /* XOR Absolute. */  		case XOR_Z: /* XOR Zero Matrix. */ -			cpu->a = xor(cpu, cpu->a, value, thread); +			cpu->a = xor(cpu, cpu->a, value, 8, thread);  			break;  		case CLI_IMP: /* CLear Interrupt. */  			setflag(0, I); @@ -1218,7 +1584,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case MUL_IMM: /* MUL Immediate. */  		case MUL_AB: /* MUL Absolute. */  		case MUL_Z: /* MUL Zero Matrix. */ -			cpu->a = mul(cpu, cpu->a, value, thread); +			cpu->a = mul(cpu, cpu->a, value, 8, thread);  			break;  		case BVC_REL: /* BVC Relative. */  			if (!getflag(V)) { @@ -1230,7 +1596,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case DIV_AB: /* DIV Absolute. */  		case DIV_Z: /* DIV Zero Matrix. */  			rem = (opcode != DIV_B) ? &cpu->b : &cpu->x; -			cpu->a = divd(cpu, cpu->a, value, rem, thread); +			cpu->a = divd(cpu, cpu->a, value, rem, 8, thread);  			break;  		case CLV_IMP: /* CLear oVerflow flag. */  			setflag(0, V); @@ -1241,7 +1607,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case CPB_IN: /* CPB Indirect. */  		case CPB_IX: /* CPB Indexed Indirect. */  		case CPB_IY: /* CPB Indirect Indexed. */ -			adc(cpu, cpu->b, ~value, 1, thread); +			adc(cpu, cpu->b, ~value, 1, 8, thread);  			break;  		case CMP_B: /* CMP B register. */  			value = cpu->b; /* Falls Through. */ @@ -1251,17 +1617,17 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  		case CMP_IN: /* CMP Indirect. */  		case CMP_IX: /* CMP Indexed Indirect. */  		case CMP_IY: /* CMP Indirect Indexed. */ -			adc(cpu, cpu->a, ~value, 1, thread); +			adc(cpu, cpu->a, ~value, 1, 8, thread);  			break;  		case CPY_IMM: /* CPY Immediate. */  		case CPY_AB: /* CPY Absolute. */  		case CPY_Z: /* CPY Zero Matrix. */ -			adc(cpu, cpu->y, ~value, 1, thread); +			adc(cpu, cpu->y, ~value, 1, 8, thread);  			break;  		case CPX_IMM: /* CPX Immediate. */  		case CPX_AB: /* CPX Absolute. */  		case CPX_Z: /* CPX Zero Matrix. */ -			adc(cpu, cpu->x, ~value, 1, thread); +			adc(cpu, cpu->x, ~value, 1, 8, thread);  			break;  		case INC_IMP: cpu->a = idr(cpu, cpu->a, 1, thread); break;  		case INB_IMP: cpu->b = idr(cpu, cpu->b, 1, thread); break; @@ -1315,3 +1681,7 @@ static /*inline*/ void exec_base_inst(struct sux *cpu, uint8_t opcode, uint8_t p  			break;  	}  } + +#undef ORTHO_1CC +#undef ORTHO_1OP +#undef ORTHO_2OP | 
