|
- 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)
|