import sys, os, random sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from helpertest import * from objfmt import Obj orig = Obj.parse(open('lib/c0047.obj','rb').read()); new = Obj.parse(open('optlib/c0047.obj','rb').read()) ho = Helper(orig, 0x6000, {}); hn = Helper(new, 0x6000, {}) rnd = random.Random(5) vals = [0,1,2,3,7,9,10,100,255,256,257,1000,12345,32767,32768,40000,65535] cases = [(a,b) for a in vals for b in vals if b != 0] cases += [(rnd.randrange(65536), rnd.randrange(1,65536)) for _ in range(500)] cases += [(rnd.randrange(65536), rnd.randrange(1,256)) for _ in range(500)] entries = ['C$0047','C$0049','C$0051','C$0053'] tot = {e:[0,0] for e in entries}; bad = 0 for e in entries: for a,b in cases: res = [] for h in (ho, hn): cpu = CPU(); h.install(cpu) for i,v in enumerate((a&255,a>>8,b&255,b>>8)): cpu.m[0x33C+i]=v cpu.m[0x14]=0; cpu.m[0x15]=0x80 cpu.a = 4; cpu.x=0; cpu.y=0 c = cpu.call(h.addr(e), maxsteps=400000) res.append((c, bytes(cpu.m[0x33C:0x350]), cpu)) tot[e][0]+=res[0][0]; tot[e][1]+=res[1][0] if res[0][1] != res[1][1]: bad += 1 if bad < 6: print('MISMATCH', e, a, b, res[0][1][:4].hex(), res[1][1][:4].hex()) print('cases per entry', len(cases), 'bad', bad) for e in entries: print(e, 'avg cycles orig %.0f new %.0f' % (tot[e][0]/len(cases), tot[e][1]/len(cases))) for a,b in ((1000,7),(300*7,1000),(99,10),(30000,3)): out=[] for h in (ho,hn): cpu=CPU(); h.install(cpu) for i,v in enumerate((a&255,a>>8,b&255,b>>8)): cpu.m[0x33C+i]=v cpu.a=4; out.append(cpu.call(h.addr('C$0051'))) print(a,b,out)