import sysR=['b','c','d','e','h','l','(hl)','a']; RP=['bc','de','hl','sp']; RP2=['bc','de','hl','af']CC=['nz','z','nc','c','po','pe','p','m']; ALU=['add a,','adc a,','sub ','sbc a,','and ','xor ','or ','cp ']ROT=['rlc','rrc','rl','rr','sla','sra','sll','srl']def dis(mem, pc, base=0): start=pc def b(): nonlocal pc v=mem[pc-base] if 0<=pc-base<len(mem) else 0; pc+=1; return v def w(): lo=b(); hi=b(); return lo|hi<<8 def sb(v): return v-256 if v>127 else v op=b(); ix=None if op in (0xdd,0xfd): ix='ix' if op==0xdd else 'iy'; op=b() def r(i,d=None): if ix and i==6: return f'({ix}{d:+d})' if ix and i in (4,5) : return ix+('h' if i==4 else 'l') return R[i] def hl(): return ix or 'hl' x=op>>6; y=(op>>3)&7; z=op&7; p=y>>1; q=y&1 if op==0xcb: if ix: d=sb(b()); op2=b() x2=op2>>6;y2=(op2>>3)&7 m=f'({ix}{d:+d})' else: op2=b(); x2=op2>>6;y2=(op2>>3)&7; m=R[op2&7] s=[f'{ROT[y2]} {m}',f'bit {y2},{m}',f'res {y2},{m}',f'set {y2},{m}'][x2] elif op==0xed: op=b(); x=op>>6; y=(op>>3)&7; z=op&7; p=y>>1; q=y&1 if x==1: if z==0: s=f'in {R[y] if y!=6 else "f"},(c)' elif z==1: s=f'out (c),{R[y] if y!=6 else "0"}' elif z==2: s=('sbc hl,' if q==0 else 'adc hl,')+RP[p] elif z==3: n=w(); s=f'ld (#{n:04x}),{RP[p]}' if q==0 else f'ld {RP[p]},(#{n:04x})' elif z==4: s='neg' elif z==5: s='retn' if y!=1 else 'reti' elif z==6: s=f'im {[0,0,1,2,0,0,1,2][y]}' else: s=['ld i,a','ld r,a','ld a,i','ld a,r','rrd','rld','nop','nop'][y] elif x==2 and z<=3 and y>=4: s=[['ldi','cpi','ini','outi'],['ldd','cpd','ind','outd'],['ldir','cpir','inir','otir'],['lddr','cpdr','indr','otdr']][y-4][z] else: s=f'db #ed,#{op:02x}' else: d=None if ix and (x==1 and (y==6 or z==6) and not (y==6 and z==6) or (x==0 and z in(4,5,6) and y==6) or (x==2 and z==6)): d=sb(b()) if x==0: if z==0: if y==0: s='nop' elif y==1: s="ex af,af'" elif y==2: e=sb(b()); s=f'djnz #{(pc+e)&0xffff:04x}' elif y==3: e=sb(b()); s=f'jr #{(pc+e)&0xffff:04x}' else: e=sb(b()); s=f'jr {CC[y-4]},#{(pc+e)&0xffff:04x}' elif z==1: if q==0: n=w(); s=f'ld {hl() if p==2 else RP[p]},#{n:04x}' else: s=f'add {hl()},{hl() if p==2 else RP[p]}' elif z==2: if q==0: if p==0: s='ld (bc),a' elif p==1: s='ld (de),a' elif p==2: n=w(); s=f'ld (#{n:04x}),{hl()}' else: n=w(); s=f'ld (#{n:04x}),a' else: if p==0: s='ld a,(bc)' elif p==1: s='ld a,(de)' elif p==2: n=w(); s=f'ld {hl()},(#{n:04x})' else: n=w(); s=f'ld a,(#{n:04x})' elif z==3: s=('inc ' if q==0 else 'dec ')+(hl() if p==2 else RP[p]) elif z==4: s='inc '+r(y,d) elif z==5: s='dec '+r(y,d) elif z==6: n=b(); s=f'ld {r(y,d)},#{n:02x}' else: s=['rlca','rrca','rla','rra','daa','cpl','scf','ccf'][y] elif x==1: if y==6 and z==6: s='halt' else: a=r(y,d); c=r(z,d) if ix and (y==6 or z==6): a=R[y] if z==6 else a; c=R[z] if y==6 else c s=f'ld {a},{c}' elif x==2: s=ALU[y]+r(z,d) else: if z==0: s='ret '+CC[y] elif z==1: if q==0: s='pop '+(hl() if p==2 else RP2[p]) else: s=['ret','exx',f'jp ({hl()})',f'ld sp,{hl()}'][p] elif z==2: n=w(); s=f'jp {CC[y]},#{n:04x}' elif z==3: if y==0: n=w(); s=f'jp #{n:04x}' elif y==2: n=b(); s=f'out (#{n:02x}),a' elif y==3: n=b(); s=f'in a,(#{n:02x})' elif y==4: s=f'ex (sp),{hl()}' elif y==5: s='ex de,hl' elif y==6: s='di' else: s='ei' elif z==4: n=w(); s=f'call {CC[y]},#{n:04x}' elif z==5: if q==0: s='push '+(hl() if p==2 else RP2[p]) else: n=w(); s=f'call #{n:04x}' elif z==6: n=b(); s=ALU[y]+f'#{n:02x}' else: s=f'rst #{y*8:02x}' return pc-start, sif __name__=='__main__': data=open(sys.argv[1],'rb').read() off=int(sys.argv[2],0); org=int(sys.argv[3],0); n=int(sys.argv[4],0) mem=data[off:] pc=org while pc<org+n: l,s=dis(mem,pc,org) print(f'{pc:04x} {mem[pc-org:pc-org+l].hex():10s} {s}') pc+=l