--- nono/exp/optestxp/optestxp_gen.cpp 2026/04/29 17:05:16 1.1.1.1 +++ nono/exp/optestxp/optestxp_gen.cpp 2026/04/29 17:05:20 1.1.1.2 @@ -4,37 +4,7 @@ // Licensed under nono-license.txt // -#include "header.h" -#include "mystring.h" -#include - -class hd64180flag -{ - public: - bool S {}; - bool Z {}; - bool H {}; - bool PV {}; - bool N {}; - bool C {}; - - uint8 Get() const { - uint8 data = 0; - if (S) data |= 0x80; - if (Z) data |= 0x40; - if (H) data |= 0x10; - if (PV) data |= 0x04; - if (N) data |= 0x02; - if (C) data |= 0x01; - return data; - } -}; - -static void out(const char *, ...); - -static const char *name; -static int testpos; -static std::vector testlist; +#include "optestxp_subr.h" static std::vector values1 = { 0x00, @@ -55,99 +25,16 @@ static std::vector values2 = { 0xff, }; -static inline bool -vflag_add(uint32 dst, uint32 src, uint32 res) -{ - uint32 v = (src ^ res) & (dst ^ res); - return (v & 0x80); -} - -static inline bool -vflag_sub(uint32 dst, uint32 src, uint32 res) -{ - uint32 v = (src ^ dst) & (dst ^ res); - return (v & 0x80); -} - -static bool -hflag_add(uint32 dst, uint32 src) -{ - uint32 res = (dst & 0x0f) + (src & 0x0f); - return (res & 0x10); -} - -static bool -hflag_sub(uint32 dst, uint32 src) -{ - uint32 res = (dst & 0x0f) - (src & 0x0f); - return (res & 0x10); -} - -static bool -pflag(uint32 res) -{ - return ((__builtin_popcount(res) & 1) == 0); -} - -// gentest の最初で行うことまとめ。 -static void -init(const char *name_, const char *method) -{ - name = name_; - testlist.push_back(name); - - out("test_%s:\n", name); - out(" LD HL,testset_%s\n", name); - out(" JP %s\n", method); - - testpos = 0; -} - -// テストセットのテーブルを出力。 -static void -out_testset(const char *name) -{ - out("testset_%s:\n", name); - out(" defw testname_%s\n", name); - out(" defw testexec_%s\n", name); - out(" defw testdata_%s_00\n", name); - - out("testname_%s:\n", name); - std::string upper = string_toupper(name); - out(" defm \"%s $\"\n", upper.c_str()); - out("\n"); -} - -// testrun1 テスト用のデータテーブルを出力。 -static void -out_testdata_run1(uint32 dst, const hd64180flag& inflag, - uint32 res, const hd64180flag& flag) -{ - out("testdata_%s_%02x:", name, testpos++); - out(" defb 0%02xH,0%02xH,0%02xH,0%02xH\n", - dst, inflag.Get(), res, flag.Get()); -} - -// testrun2 テスト用のデータテーブルを出力。 -static void -out_testdata_run2(uint32 dst, const hd64180flag& inflag, uint32 src, - uint32 res, const hd64180flag& flag) -{ - out("testdata_%s_%02x:", name, testpos++); - out(" defb 0%02xH,0%02xH,0%02xH,0%02xH,0%02xH\n", - dst, inflag.Get(), src, res, flag.Get()); -} - static void gentest_add() { init("add", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" ADD A,D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (auto src : values1) { @@ -174,11 +61,11 @@ gentest_adc() { init("adc", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" ADC A,D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (auto src : values1) { @@ -208,11 +95,11 @@ gentest_sub() { init("sub", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" SUB D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (auto src : values1) { @@ -239,11 +126,11 @@ gentest_sbc() { init("sbc", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" SBC A,D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (auto src : values1) { @@ -273,11 +160,11 @@ gentest_and() { init("and", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" AND D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { for (auto src : values2) { @@ -306,11 +193,11 @@ gentest_or() { init("or", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" OR D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { for (auto src : values2) { @@ -339,11 +226,11 @@ gentest_xor() { init("xor", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" XOR D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { for (auto src : values2) { @@ -372,11 +259,11 @@ gentest_cp() { init("cp", "testrun2"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" CP D\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (auto src : values1) { @@ -403,11 +290,11 @@ gentest_inc() { init("inc", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" INC A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (int cin = 0; cin <= 1; cin++) { @@ -435,11 +322,11 @@ gentest_dec() { init("dec", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" DEC A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { for (int cin = 0; cin <= 1; cin++) { @@ -467,11 +354,11 @@ gentest_neg() { init("neg", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" NEG\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values1) { uint32 res32 = 0 - dst; @@ -496,11 +383,11 @@ gentest_cpl() { init("cpl", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" CPL\n"); out(" RET\n"); - out_testset(name); + out_testset(); bool fin = false; for (auto dst : values2) { @@ -532,11 +419,11 @@ gentest_rla() { init("rla", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RLA\n"); out(" RET\n"); - out_testset(name); + out_testset(); bool fin = false; for (auto dst : values2) { @@ -571,11 +458,11 @@ gentest_rra() { init("rra", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RRA\n"); out(" RET\n"); - out_testset(name); + out_testset(); bool fin = false; for (auto dst : values2) { @@ -610,11 +497,11 @@ gentest_rlca() { init("rlca", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RLCA\n"); out(" RET\n"); - out_testset(name); + out_testset(); bool fin = false; for (auto dst : values2) { @@ -646,11 +533,11 @@ gentest_rrca() { init("rrca", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RRCA\n"); out(" RET\n"); - out_testset(name); + out_testset(); bool fin = false; for (auto dst : values2) { @@ -682,11 +569,11 @@ gentest_rl() { init("rl", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RL A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { for (int cin = 0; cin <= 1; cin++) { @@ -716,11 +603,11 @@ gentest_rr() { init("rr", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RR A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { for (int cin = 0; cin <= 1; cin++) { @@ -750,11 +637,11 @@ gentest_rlc() { init("rlc", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RLC A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { uint32 res32 = dst << 1; @@ -781,11 +668,11 @@ gentest_rrc() { init("rrc", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" RRC A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { uint32 res32 = dst >> 1; @@ -812,11 +699,11 @@ gentest_sla() { init("sla", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" SLA A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { uint32 res32 = dst << 1; @@ -842,11 +729,11 @@ gentest_sra() { init("sra", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" SRA A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { uint32 res32 = dst >> 1; @@ -873,11 +760,11 @@ gentest_srl() { init("srl", "testrun1"); - out("testexec_%s:\n", name); + out("testexec_%s:\n", testname); out(" SRL A\n"); out(" RET\n"); - out_testset(name); + out_testset(); for (auto dst : values2) { uint32 res32 = dst >> 1; @@ -898,16 +785,6 @@ gentest_srl() out("\n"); } -static void -out(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); -} - int main(int ac, char *av[]) { @@ -947,4 +824,6 @@ main(int ac, char *av[]) out(" CALL test_%s\n", name.c_str()); } out(" RET\n"); + + return 0; }