RAINBOW ISLANDS

par davidnurdin · Remakes
pas encore noté
▶ Jouer Sources Éditer GitHub
games/rainbow-island / tools / extract / z80dis.py · commit d529485
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