#!/bin/python

btable = '''
FEDFA500:   00000000 00000000 00000000 00000000     ................
FEDFA510:   00000000 00000000 00000000 00000000     ................
FEDFA520:   00000000 00000000 00000000 00000000     ................
FEDFA530:   00000000 00000000 00000000 00000000     ................
FEDFA540:   00000000 00000000 00000000 00000000     ................
FEDFA550:   00000000 00000000 00000000 00000000     ................
FEDFA560:   00000000 00000000 00000000 00FFB80A     ..............8.
FEDFA570:   00FFB602 00FFB702 00FFB80A 00FFB90A     ..6...7...8...9.
FEDFA580:   00000000 00000000 00000000 00000000     ................
FEDFA590:   00000000 00000000 00000000 00000000     ................
FEDFA5A0:   00000000 00000000 00000000 00000000     ................
FEDFA5B0:   00000000 00000000 00000000 00000000     ................
FEDFA5C0:   00000000 00000000 00000000 00000000     ................
FEDFA5D0:   00000000 00000000 00000000 00000000     ................
FEDFA5E0:   00000000 00000000 00000000 00000000     ................
FEDFA5F0:   00000000 00000000 00FFBA0A 00FFBB02     ..........:...;.
'''

ctable = '''
FEDFB600:	00000000 00000000 00000000 00000000 	................
FEDFB610:	00000000 00000000 00000000 00000000 	................
FEDFB620:	00000000 00000000 00000000 00000000 	................
FEDFB630:	00000000 00000000 00000000 00000000 	................
FEDFB640:	00000000 00000000 00000000 00000000 	................
FEDFB650:	00000000 00000000 00000000 00000000 	................
FEDFB660:	00000000 00000000 00000000 00000000 	................
FEDFB670:	00000000 00000000 00000000 00000000 	................
FEDFB680:	00000000 00000000 00000000 00000000 	................
FEDFB690:	00000000 00000000 00000000 00000000 	................
FEDFB6A0:	00000000 00000000 00000000 00000000 	................
FEDFB6B0:	00000000 00000000 00000000 00000000 	................
FEDFB6C0:	00000000 00000000 00000000 00000000 	................
FEDFB6D0:	00000000 00000000 00000000 00000000 	................
FEDFB6E0:	00000000 00000000 00000000 00000000 	................
FEDFB6F0:	00000000 00000000 00000000 00000000 	................
FEDFB700:	00000000 00000000 00000000 00000000 	................
FEDFB710:	00000000 00000000 00000000 00000000 	................
FEDFB720:	00000000 00000000 00000000 00000000 	................
FEDFB730:	00000000 00000000 00000000 00000000 	................
FEDFB740:	00000000 00000000 00000000 00000000 	................
FEDFB750:	00000000 00000000 00000000 00000000 	................
FEDFB760:	00000000 00000000 00000000 00000000 	................
FEDFB770:	00000000 00000000 00000000 00000000 	................
FEDFB780:	00000000 00000000 00000000 00000000 	................
FEDFB790:	00000000 00000000 00000000 00000000 	................
FEDFB7A0:	00000000 00000000 00000000 00000000 	................
FEDFB7B0:	00000000 00000000 00000000 00000000 	................
FEDFB7C0:	00000000 00000000 00000000 00000000 	................
FEDFB7D0:	00000000 00000000 00000000 00000000 	................
FEDFB7E0:	00000000 00000000 00000000 00000000 	................
FEDFB7F0:	00000000 00000000 00000000 00000000 	................
FEDFB800:	62000059 62002059 64000049 64000839 	b..Yb..Yd..Id..9
FEDFB810:	61001059 61001459 00000000 65002041 	a..Ya..Y....e..A
FEDFB820:	00000000 66002041 00000000 61000059 	....f..A....a..Y
FEDFB830:	61000449 61000859 61000C41 50300049 	a..Ia..Ya..AP0.I
FEDFB840:	00000000 00000000 00000000 00000000 	................
FEDFB850:	00000000 00000000 00000000 00000000 	................
FEDFB860:	00000000 00000000 00000000 00000000 	................
FEDFB870:	00000000 00000000 00000000 00000000 	................
FEDFB880:	00000000 00000000 00000000 00000000 	................
FEDFB890:	00000000 00000000 00000000 00000000 	................
FEDFB8A0:	00000000 00000000 00000000 00000000 	................
FEDFB8B0:	00000000 00000000 00000000 00000000 	................
FEDFB8C0:	00FFE059 00000000 00FFA059 60000059 	..`Y.......Y`..Y
FEDFB8D0:	00000000 00000000 00000000 00000000 	................
FEDFB8E0:	00000000 00FFC059 00FFA041 00000000 	......@Y...A....
FEDFB8F0:	00000000 00FFA049 00000000 00000000 	.......I........
FEDFB900:	6F000059 65002059 66000059 66000059 	o..Ye..Yf..Yf..Y
FEDFB910:	66000059 66000059 00000000 00000000 	f..Yf..Y........
FEDFB920:	00000000 00000000 00000000 00000000 	................
FEDFB930:	00000000 00000000 00000000 00000000 	................
FEDFB940:	00000000 00000000 00000000 00000000 	................
FEDFB950:	00000000 00000000 00000000 00000000 	................
FEDFB960:	00000000 00000000 00000000 00000000 	................
FEDFB970:	00000000 00000000 00000000 00000000 	................
FEDFB980:	00000000 00000000 00000000 00000000 	................
FEDFB990:	00000000 00000000 00000000 00000000 	................
FEDFB9A0:	00000000 00000000 00000000 00000000 	................
FEDFB9B0:	00000000 00000000 00000000 00000000 	................
FEDFB9C0:	63000009 63002009 63004009 63006009 	c...c...c.@.c.`.
FEDFB9D0:	63008001 6300A009 6300C001 6300E009 	c...c...c.@.c.`.
FEDFB9E0:	63010009 63012009 63014009 63016009 	c...c...c.@.c.`.
FEDFB9F0:	63018001 6301A001 6301C001 6301E001 	c...c...c.@.c.`.
FEDFBA00:	00FF8041 00FF6059 00FF4059 00E06041 	...A..`Y..@Y.``A
FEDFBA10:	00E08041 00E0A041 00E0C041 00E0E041 	.`.A.`.A.`@A.``A
FEDFBA20:	00E10041 00E12041 00E14041 00E16041 	.a.A.a.A.a@A.a`A
FEDFBA30:	00E18041 00E1A041 00E1C041 00E1E041 	.a.A.a.A.a@A.a`A
FEDFBA40:	00E20041 00E22041 00E24041 00E26041 	.b.A.b.A.b@A.b`A
FEDFBA50:	00E28041 00E2A041 00E2C041 00E2E041 	.b.A.b.A.b@A.b`A
FEDFBA60:	00E30041 00E32041 00E34041 00E36041 	.c.A.c.A.c@A.c`A
FEDFBA70:	00E38041 00E3A041 00E3C041 00E3E041 	.c.A.c.A.c@A.c`A
FEDFBA80:	00E40041 00E42041 00E44041 00E46041 	.d.A.d.A.d@A.d`A
FEDFBA90:	00E48041 00E4A041 00E4C041 00E4E041 	.d.A.d.A.d@A.d`A
FEDFBAA0:	00E50041 00E52041 00E54041 00E56041 	.e.A.e.A.e@A.e`A
FEDFBAB0:	00E58041 00E5A041 00E5C041 00E5E041 	.e.A.e.A.e@A.e`A
FEDFBAC0:	00E60041 00E62041 00E64041 00E66041 	.f.A.f.A.f@A.f`A
FEDFBAD0:	00E68041 00E6A041 00E6C041 00E6E041 	.f.A.f.A.f@A.f`A
FEDFBAE0:	00E70041 00E72041 00E74041 00E76041 	.g.A.g.A.g@A.g`A
FEDFBAF0:	00E78041 00E7A041 00E7C041 00E7E041 	.g.A.g.A.g@A.g`A
FEDFBB00:	00E80041 00E82041 00E84041 00E86041 	.h.A.h.A.h@A.h`A
FEDFBB10:	00E88041 00E8A041 00E8C041 00E8E041 	.h.A.h.A.h@A.h`A
FEDFBB20:	00E90041 00E92041 00E94041 00E96041 	.i.A.i.A.i@A.i`A
FEDFBB30:	00E98041 00E9A041 00E9C041 00E9E041 	.i.A.i.A.i@A.i`A
FEDFBB40:	00EA0041 00EA2041 00EA4041 00EA6041 	.j.A.j.A.j@A.j`A
FEDFBB50:	00EA8041 00EAA041 00EAC041 00EAE041 	.j.A.j.A.j@A.j`A
FEDFBB60:	00EB0041 00EB2041 00EB4041 00EB6041 	.k.A.k.A.k@A.k`A
FEDFBB70:	00EB8041 00EBA041 00EBC041 00EBE041 	.k.A.k.A.k@A.k`A
FEDFBB80:	00EC0041 00EC2041 00EC4041 00EC6041 	.l.A.l.A.l@A.l`A
FEDFBB90:	00EC8041 00ECA041 00ECC041 00ECE041 	.l.A.l.A.l@A.l`A
FEDFBBA0:	00ED0041 00ED2041 00ED4041 00ED6041 	.m.A.m.A.m@A.m`A
FEDFBBB0:	00ED8041 00EDA041 00EDC041 00EDE041 	.m.A.m.A.m@A.m`A
FEDFBBC0:	00EE0041 00EE2041 00EE4041 00EE6041 	.n.A.n.A.n@A.n`A
FEDFBBD0:	00EE8041 00EEA041 00EEC041 00EEE041 	.n.A.n.A.n@A.n`A
FEDFBBE0:	00EF0041 00EF2041 00EF4041 00EF6041 	.o.A.o.A.o@A.o`A
FEDFBBF0:	00EF8041 00EFA041 00EFC041 00FFC041 	.o.A.o.A.o@A..@A
'''

# this gets called with the last 2 as argument
# 00ffa56c fed80000 00FFB80A
# 00ffa570 fee00000 00FFB602
def old_process_b ( addr, table ) :
        v_add = int ( addr, 16 )
        t_add = int ( table, 16 )
        t_add &= 0xffffff00
        for _ in range ( 64 ) :
            pte = int ( ddict[t_add], 16 )
            pte &= 0xffffff00
            if pte == 0 :
                print ( f"{v_add:08x} {t_add:08x} ---" )
            else :
                print ( f"{v_add:08x} {t_add:08x} {pte:08x}" )
            v_add += 0x2000
            t_add += 4

def do_bdata_OLD ( data ) :
    lines = data.splitlines()
    for line in lines:
        if line == "" :
            continue
        ll = line.split()
        if ll[2] == '00000000' :
            continue
        print ( "B: ", line )
        process_b ( ll[1], ll[2] )


def valid_b ( v_add, t_add ) :
        #print ( f"Valid B table at {t_add:08x}" )
        t_add &= 0xffffff00
        for _ in range ( 64 ) :
            pte = int ( ddict[t_add], 16 )
            pte &= 0xffffff00
            if pte == 0 :
                #print ( f"{v_add:08x} {t_add:08x} ---" )
                print ( f"{v_add:08x}  ---" )
            else :
                #print ( f"{v_add:08x} {t_add:08x} {pte:08x}" )
                print ( f"{v_add:08x}  {pte:08x}" )
            v_add += 0x2000
            t_add += 4

# Here is a typical line:
# FEDFB800:	62000059 62002059 64000049 64000839 	b..Yb..Yd..Id..9
def load_ctable ( data ) :
    lines = data.splitlines()

    for line in lines:
        if line == "" :
            continue
        ll = line.split()[0:5]

        tmp = ll[0].replace ( ':', '' )
        add = tmp.replace ( 'FEDF', '00FF' )
        i_add = int ( add, 16 )

        for x in ll[1:] :
            #print ( f"{i_add:08x} ", x )
            #key = f"{i_add:08x}"
            key = i_add
            ddict[key] = x
            i_add += 4

def b_process ( vaddr, line ) :
        #print ( line )
        ll = line.split()[0:5]
        tmp = ll[0].replace ( ':', '' )
        add = tmp.replace ( 'FEDF', '00FF' )
        i_add = int ( add, 16 )
        for x in ll[1:] :
            #print ( f"{i_add:08x} {vaddr:08x}", x )
            val = int ( x, 16 )
            if val != 0 :
                valid_b ( vaddr, val )
            i_add += 4
            vaddr += 0x80000

def do_btable ( data ) :
    lines = data.splitlines()

    vaddr = 0xfe00_0000

    for line in lines:
        if line != "" :
            b_process ( vaddr, line )
            vaddr += 4 * 0x80000

# ----------------------------------

ddict = {}
load_ctable ( ctable )

# 00ffb838  61000C41
#xx = 0x00ffb838
#print ( ddict[xx] )

do_btable ( btable )

# THE END
