File:  [Isaki's NoNo m68k/m88k emulator] / nono / exp / optestxp / optestxp_gen.cpp
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:20 2026 UTC (3 months ago) by root
Branches: MAIN, Isaki
CVS tags: v027, v026, v025, v024, v023, v022, v021, v020, v019, v018, HEAD
nono 0.6.0

//
// nono
// Copyright (C) 2023 nono project
// Licensed under nono-license.txt
//

#include "optestxp_subr.h"

static std::vector<uint8> values1 = {
	0x00,
	0x01,
	0x0f,
	0x10,
	0x7f,
	0x80,
	0xff,
};
static std::vector<uint8> values2 = {
	0x00,
	0x01,
	0x03,
	0x55,
	0x7f,
	0xaa,
	0xff,
};

static void
gentest_add()
{
	init("add", "testrun2");

	out("testexec_%s:\n", testname);
	out("	ADD	A,D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (auto src : values1) {
			uint32 res32 = dst + src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.N = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = ((res32 & 0x0100) != 0);
			flag.PV = vflag_add(dst, src, res);
			flag.H = hflag_add(dst, src);
			flag.N = false;
			out_testdata_run2(dst, inflag, src, res, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_adc()
{
	init("adc", "testrun2");

	out("testexec_%s:\n", testname);
	out("	ADC	A,D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (auto src : values1) {
			for (int cin = 0; cin <= 1; cin++) {
				uint32 res32 = dst + src + cin;
				uint8 res = res32;
				hd64180flag inflag;
				inflag.C = cin;
				inflag.N = true;
				hd64180flag flag;
				flag.Z = (res == 0);
				flag.S = ((res & 0x80) != 0);
				flag.C = ((res32 & 0x0100) != 0);
				flag.PV = vflag_add(dst, src, res);
				flag.H = hflag_add(dst, src) | hflag_add(src + dst, cin);
				flag.N = false;
				out_testdata_run2(dst, inflag, src, res, flag);
			}
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_sub()
{
	init("sub", "testrun2");

	out("testexec_%s:\n", testname);
	out("	SUB	D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (auto src : values1) {
			uint32 res32 = dst - src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.N = false;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = ((res32 & 0x0100) != 0);
			flag.PV = vflag_sub(dst, src, res);
			flag.H = hflag_sub(dst, src);
			flag.N = true;
			out_testdata_run2(dst, inflag, src, res, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_sbc()
{
	init("sbc", "testrun2");

	out("testexec_%s:\n", testname);
	out("	SBC	A,D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (auto src : values1) {
			for (int cin = 0; cin <= 1; cin++) {
				uint32 res32 = dst - src - cin;
				uint8 res = res32;
				hd64180flag inflag;
				inflag.C = cin;
				inflag.N = false;
				hd64180flag flag;
				flag.Z = (res == 0);
				flag.S = ((res & 0x80) != 0);
				flag.C = ((res32 & 0x0100) != 0);
				flag.PV = vflag_sub(dst, src, res);
				flag.H = hflag_sub(dst, src) | hflag_sub(dst - src, cin);
				flag.N = true;
				out_testdata_run2(dst, inflag, src, res, flag);
			}
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_and()
{
	init("and", "testrun2");

	out("testexec_%s:\n", testname);
	out("	AND	D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		for (auto src : values2) {
			uint32 res32 = dst & src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.H = false;
			inflag.N = true;
			inflag.C = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = false;
			flag.PV = pflag(res);
			flag.H = true;
			flag.N = false;
			out_testdata_run2(dst, inflag, src, res, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_or()
{
	init("or", "testrun2");

	out("testexec_%s:\n", testname);
	out("	OR	D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		for (auto src : values2) {
			uint32 res32 = dst | src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.H = true;
			inflag.N = true;
			inflag.C = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = false;
			flag.PV = pflag(res);
			flag.H = false;
			flag.N = false;
			out_testdata_run2(dst, inflag, src, res, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_xor()
{
	init("xor", "testrun2");

	out("testexec_%s:\n", testname);
	out("	XOR	D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		for (auto src : values2) {
			uint32 res32 = dst ^ src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.H = true;
			inflag.N = true;
			inflag.C = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = false;
			flag.PV = pflag(res);
			flag.H = false;
			flag.N = false;
			out_testdata_run2(dst, inflag, src, res, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_cp()
{
	init("cp", "testrun2");

	out("testexec_%s:\n", testname);
	out("	CP	D\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (auto src : values1) {
			uint32 res32 = dst - src;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.N = false;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = ((res32 & 0x0100) != 0);
			flag.PV = vflag_sub(dst, src, res);
			flag.H = hflag_sub(dst, src);
			flag.N = true;
			out_testdata_run2(dst, inflag, src, dst, flag);
		}
	}
	out("	defb	0,0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_inc()
{
	init("inc", "testrun1");

	out("testexec_%s:\n", testname);
	out("	INC	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst + 1;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.C = cin;
			inflag.N = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = cin;
			flag.PV = vflag_add(dst, 1, res);
			flag.H = hflag_add(dst, 1);
			flag.N = false;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_dec()
{
	init("dec", "testrun1");

	out("testexec_%s:\n", testname);
	out("	DEC	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst - 1;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.C = cin;
			inflag.N = false;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = cin;
			flag.PV = vflag_sub(dst, 1, res);
			flag.H = hflag_sub(dst, 1);
			flag.N = true;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_neg()
{
	init("neg", "testrun1");

	out("testexec_%s:\n", testname);
	out("	NEG\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values1) {
		uint32 res32 = 0 - dst;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = false;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((res32 & 0x100) != 0);
		flag.PV = vflag_sub(0, dst, res);
		flag.H = hflag_sub(0, dst);
		flag.N = true;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_cpl()
{
	init("cpl", "testrun1");

	out("testexec_%s:\n", testname);
	out("	CPL\n");
	out("	RET\n");

	out_testset();

	bool fin = false;
	for (auto dst : values2) {
		fin = !fin;
		uint32 res32 = ~dst;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.Z = fin;
		inflag.S = fin;
		inflag.C = fin;
		inflag.PV = fin;
		inflag.N = false;
		inflag.H = false;
		hd64180flag flag;
		flag.Z = fin;
		flag.S = fin;
		flag.C = fin;
		flag.PV = fin;
		flag.H = true;
		flag.N = true;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rla()
{
	init("rla", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RLA\n");
	out("	RET\n");

	out_testset();

	bool fin = false;
	for (auto dst : values2) {
		fin = !fin;
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst << 1;
			res32 |= cin;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.Z = fin;
			inflag.S = fin;
			inflag.C = cin;
			inflag.PV = fin;
			inflag.N = true;
			inflag.H = true;
			hd64180flag flag;
			flag.Z = fin;
			flag.S = fin;
			flag.C = ((res32 & 0x100) != 0);
			flag.PV = fin;
			flag.H = false;
			flag.N = false;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rra()
{
	init("rra", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RRA\n");
	out("	RET\n");

	out_testset();

	bool fin = false;
	for (auto dst : values2) {
		fin = !fin;
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst >> 1;
			res32 |= cin ? 0x80 : 0;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.Z = fin;
			inflag.S = fin;
			inflag.C = cin;
			inflag.PV = fin;
			inflag.N = true;
			inflag.H = true;
			hd64180flag flag;
			flag.Z = fin;
			flag.S = fin;
			flag.C = ((dst & 1) != 0);
			flag.PV = fin;
			flag.H = false;
			flag.N = false;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rlca()
{
	init("rlca", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RLCA\n");
	out("	RET\n");

	out_testset();

	bool fin = false;
	for (auto dst : values2) {
		fin = !fin;
		uint32 res32 = dst << 1;
		res32 |= (res32 >> 8);
		uint8 res = res32;
		hd64180flag inflag;
		inflag.Z = fin;
		inflag.S = fin;
		inflag.PV = fin;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = fin;
		flag.S = fin;
		flag.C = ((res32 & 0x100) != 0);
		flag.PV = fin;
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rrca()
{
	init("rrca", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RRCA\n");
	out("	RET\n");

	out_testset();

	bool fin = false;
	for (auto dst : values2) {
		fin = !fin;
		uint32 res32 = dst >> 1;
		res32 |= dst << 7;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.Z = fin;
		inflag.S = fin;
		inflag.PV = fin;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = fin;
		flag.S = fin;
		flag.C = ((dst & 1) != 0);
		flag.PV = fin;
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rl()
{
	init("rl", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RL	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst << 1;
			res32 |= cin;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.C = cin;
			inflag.N = true;
			inflag.H = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = ((res32 & 0x100) != 0);
			flag.PV = pflag(res);
			flag.H = false;
			flag.N = false;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rr()
{
	init("rr", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RR	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		for (int cin = 0; cin <= 1; cin++) {
			uint32 res32 = dst >> 1;
			res32 |= cin ? 0x80 : 0;
			uint8 res = res32;
			hd64180flag inflag;
			inflag.C = cin;
			inflag.N = true;
			inflag.H = true;
			hd64180flag flag;
			flag.Z = (res == 0);
			flag.S = ((res & 0x80) != 0);
			flag.C = ((dst & 1) != 0);
			flag.PV = pflag(res);
			flag.H = false;
			flag.N = false;
			out_testdata_run1(dst, inflag, res, flag);
		}
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rlc()
{
	init("rlc", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RLC	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		uint32 res32 = dst << 1;
		res32 |= (res32 >> 8);
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((res32 & 0x100) != 0);
		flag.PV = pflag(res);
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_rrc()
{
	init("rrc", "testrun1");

	out("testexec_%s:\n", testname);
	out("	RRC	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		uint32 res32 = dst >> 1;
		res32 |= dst << 7;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((dst & 1) != 0);
		flag.PV = pflag(res);
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_sla()
{
	init("sla", "testrun1");

	out("testexec_%s:\n", testname);
	out("	SLA	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		uint32 res32 = dst << 1;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((res32 & 0x100) != 0);
		flag.PV = pflag(res);
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_sra()
{
	init("sra", "testrun1");

	out("testexec_%s:\n", testname);
	out("	SRA	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		uint32 res32 = dst >> 1;
		res32 |= (dst & 0x80);
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((dst & 1) != 0);
		flag.PV = pflag(res);
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

static void
gentest_srl()
{
	init("srl", "testrun1");

	out("testexec_%s:\n", testname);
	out("	SRL	A\n");
	out("	RET\n");

	out_testset();

	for (auto dst : values2) {
		uint32 res32 = dst >> 1;
		uint8 res = res32;
		hd64180flag inflag;
		inflag.N = true;
		inflag.H = true;
		hd64180flag flag;
		flag.Z = (res == 0);
		flag.S = ((res & 0x80) != 0);
		flag.C = ((dst & 1) != 0);
		flag.PV = pflag(res);
		flag.H = false;
		flag.N = false;
		out_testdata_run1(dst, inflag, res, flag);
	}
	out("	defb	0,0,0,0FFH\n");
	out("\n");
}

int
main(int ac, char *av[])
{
	out("	org	0100H\n");
	out("	JP	main\n");
	out("\n");

	gentest_add();
	gentest_adc();
	gentest_sub();
	gentest_sbc();
	gentest_and();
	gentest_or();
	gentest_xor();
	gentest_cp();

	gentest_inc();
	gentest_dec();
	gentest_neg();
	gentest_cpl();

	gentest_rla();
	gentest_rra();
	gentest_rlca();
	gentest_rrca();

	gentest_rl();
	gentest_rr();
	gentest_rlc();
	gentest_rrc();
	gentest_sla();
	gentest_sra();
	gentest_srl();

	out("main:\n");
	for (auto name : testlist) {
		out("	CALL	test_%s\n", name.c_str());
	}
	out("	RET\n");

	return 0;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.