def dispatch_table_arg(p, adr, cpu): assert p.m.rd(adr) == 0xce assert p.m.rd(adr + 3) == 0x7e ptr = p.m.b16(adr + 1) ii = cpu.disass(adr + 3, "ins") const.ptr(p, ptr, 2) tbl = p.m.b16(ptr) aa = tbl xx = dict() for i in p.hpib_cmd: if len(i) == 1: break for j in range(i[1], i[2] + 1): x = const.ptr(p, aa, 2) y = i[0] + "%d" % j dd = p.m.b16(aa) cpu.disass(dd) if dd not in xx: ii.flow("call", "XFUNC", dd) xx[dd] = True p.setlabel(dd, "CMD_" + y + "_" + gpib_expl[y]) aa += 2 x = p.t.add(tbl, aa, "idx-table") x.blockcmt += "-\nDispatch table for HPIB cmds with arg"
def keyboard_dispatch(p, cpu, adr = 0x7962): assert p.m.rd(adr) == 0xce assert p.m.rd(adr + 3) == 0x7e ptr = p.m.b16(adr + 1) ii = cpu.disass(adr + 3, "ins") const.ptr(p, ptr, 2) tbl = p.m.b16(ptr) aa = tbl xx = dict() for col in range(8,0,-1): p.setlabel(aa, "Keyboard_Column_%d" % col) for row in range(1,5): x = const.ptr(p, aa, 2) dd = p.m.b16(aa) cpu.disass(dd) if dd not in xx: ii.flow("call", "XFUNC", dd) xx[dd] = True aa += 2 x = p.t.add(tbl, aa, "tbl") x.blockcmt += "-\nDispatch table for Keyboard commands\n" p.setlabel(p.m.b16(tbl + 4), "KEY_Ext_Arm") p.setlabel(p.m.b16(tbl + 6), "KEY_UNDEF") p.setlabel(p.m.b16(tbl + 10), "KEY_Ext_Hold_Off") p.setlabel(p.m.b16(tbl + 14), "KEY_Reset")
def jmptbl(p, jmp, low, high, name, flow="call"): x = p.t.add(low, high, "tbl") print("Call table for", name) ins = cpu.ins[jmp] for i in range(low, high, 2): const.ptr(p, i) y = p.m.b16(i) ins.flow(flow, name, y) cpu.disass(y)
def __vector(self, adr, nm): x = const.ptr(self.p, adr, 2) x.cmt.append("Vector: " + nm) w = self.p.m.w16(adr) x.a['flow'] = (("cond", "T", w), ) self.disass(w) self.p.setlabel(w, nm + "_VECTOR")
def __vector(self, adr, nm): x = const.ptr(self.p, adr, 2) x.cmt.append("Vector: " + nm) w = self.p.m.w16(adr) x.a['flow'] = (("cond", "T", w),) self.disass(w) self.p.setlabel(w, nm + "_VECTOR")
def dsp_dispatch(p, cpu, adr = 0x683b): assert p.m.rd(adr) == 0xce assert p.m.rd(adr + 3) == 0xbd tbl = p.m.b16(adr + 1) ii = cpu.disass(adr + 3) p.setlabel(tbl, "DSP_FUNC_TABLE") x=p.t.add(tbl, tbl + 8 * 2, "tbl") x.blockcmt += "-\nTable of display functions\n" dspf= ("AVG", "STD", "MIN", "MAX", "REF", "EVT", "DS6", "ALL") j=0 for i in range(tbl, tbl + 8 * 2, 2): x = const.ptr(p, i, 2) w = p.m.b16(i) p.setlabel(w, "DSP_" + dspf[j]) ii.flow("call", "DSPFUNC", w) cpu.disass(w) j += 1
dot_24bit(p, 0x6b35, 1, "%d") dot_24bit(p, 0x6b38, 1, "%d") ####################################################################### ####################################################################### const.txtlen(p,0x78f3,4) const.txtlen(p,0x78f7,6) const.txtlen(p,0x78fd,2) p.setlabel(0x77d9, "OUT_STRINGS") for i in range(0x77d9, 0x77f9, 4): const.txtlen(p,i,4) const.ptr(p, 0x7915, 2) ####################################################################### hp5370.chargen(p, 0x7e29) hp5370.hpib_cmd_table(p, 0x7c5d) hp5370.keyboard_dispatch(p, cpu) hp5370.hpib_arg_range(p, 0x7d65) hp5370.hpib_tbl_idx(p, 0x7d81) hp5370.dispatch_table_arg(p, 0x7d5f, cpu) hp5370.dispatch_table_noarg(p, 0x7d29, cpu) hp5370.dsp_dispatch(p, cpu) hp5370.square_table(p) hp53xx.wr_test_val(p) if True:
dot_24bit(p, 0x6b32, 1, "%d") dot_24bit(p, 0x6b35, 1, "%d") dot_24bit(p, 0x6b38, 1, "%d") ####################################################################### # strings const.txtlen(p,0x78f3,4) const.txtlen(p,0x78f7,6) const.txtlen(p,0x78fd,2) p.setlabel(0x77d7, "OUT_STRINGS") for i in range(0x77d7,0x77f7,4): const.txtlen(p,i,4) const.ptr(p, 0x7915, 2) ####################################################################### # BCD->7seg table hp5370.chargen(p, 0x7e30) hp5370.hpib_cmd_table(p, 0x7c64) hp5370.keyboard_dispatch(p, cpu) hp5370.hpib_arg_range(p, 0x7d6c) hp5370.hpib_tbl_idx(p, 0x7d88) hp5370.dispatch_table_arg(p, 0x7d66, cpu) hp5370.dispatch_table_noarg(p, 0x7d30, cpu) hp5370.dsp_dispatch(p, cpu) hp5370.square_table(p) hp53xx.wr_test_val(p)