import sys, os, random sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from helpertest import * from objfmt import Obj from pcasm import assemble orig = Obj.parse(open('lib/cmulti.obj','rb').read()) new, _ = assemble(open('src/cmulti.s').read()) ho = Helper(orig, 0x6000, {}); hn = Helper(new, 0x6000, {}) rnd = random.Random(1) cases = [(a,b) for a in (0,1,2,3,7,255,256,257,1000,32767,65535) for b in (0,1,2,3,7,255,256,257,1000,32767,65535)] cases += [(rnd.randrange(65536), rnd.randrange(65536)) for _ in range(600)] cases += [(rnd.randrange(256), rnd.randrange(65536)) for _ in range(300)] + [(rnd.randrange(65536), rnd.randrange(256)) for _ in range(300)] co = cn = 0; bad = 0 for a, b in cases: for accinit in ((0,0),): res = [] for h in (ho, hn): cpu = CPU(); h.install(cpu) cpu.m[0x5a], cpu.m[0x5b] = a & 255, a >> 8 cpu.m[0x5c], cpu.m[0x5d] = b & 255, b >> 8 cpu.m[0x5e], cpu.m[0x5f] = accinit c = cpu.call(h.addr('C$MULTI')) res.append((c, bytes(cpu.m[0x40:0x70]), cpu)) co += res[0][0]; cn += res[1][0] lo_o = res[0][2].m[0x5c] | res[0][2].m[0x5d] << 8 lo_n = res[1][2].m[0x5c] | res[1][2].m[0x5d] << 8 if lo_o != lo_n or lo_o != (a*b) & 0xFFFF or res[0][1][:0x1a] != res[1][1][:0x1a]: bad += 1 if bad < 5: print('MISMATCH', a, b, lo_o, lo_n, res[0][1].hex(), res[1][1].hex()) print('cases', len(cases), 'bad', bad, 'avg cycles orig %.0f new %.0f' % (co/len(cases), cn/len(cases))) print('code size orig', len(orig.code), 'new', len(new.code))