Admin Panel

from amitools.vamos.machine import MockMemory
from amitools.vamos.astructs import AmigaStruct, AmigaStructDef, BAddr


@AmigaStructDef
class MyStruct(AmigaStruct):
  _format = [
      ('WORD', 'ms_Word'),
      ('UWORD', 'ms_Pad'),
      ('BPTR', 'ms_SegList'),
      ('LONG', 'ms_StackSize'),
  ]


@AmigaStructDef
class SubStruct(AmigaStruct):
  _format = [
      ('My', 'ss_My'),
      ('My*', 'ss_MyPtr'),
      ('Sub*', 'ss_SubPtr')
  ]


def astruct_astruct_base_test():
  # check class
  assert MyStruct.get_type_name() == 'My'
  assert MyStruct.get_size() == 12
  assert len(MyStruct.get_fields()) == 4
  assert MyStruct.get_num_fields() == 4
  ms_Word = MyStruct.get_field_by_name('ms_Word')
  assert MyStruct.ms_Word_field == ms_Word
  assert MyStruct.get_field_names(
  ) == ['ms_Word', 'ms_Pad', 'ms_SegList', 'ms_StackSize']
  # offset
  assert MyStruct.get_field_offset_for_path('ms_SegList') == 4
  assert MyStruct.get_field_offset_for_path('ms_Pad') == 2
  MyStruct.dump_type()
  # data class
  dc = MyStruct.get_data_class()
  assert dc
  assert dc.__name__ == 'MyData'
  data = dc(ms_Word=12, ms_Pad=0, ms_SegList=3, ms_StackSize=5)
  # check instance
  mem = MockMemory()
  ms = MyStruct(mem, 0x10)
  assert str(ms) == "[AStruct:My,@000010+00000c]"
  # data
  data = ms.read_data()
  ms.write_data(data)
  ms.dump()
  # access
  ms.write_field("ms_Word", -3000)
  assert ms.read_field("ms_Word") == -3000
  word_field = ms.get_field_by_name('ms_Word')
  assert ms.read_field_ext("ms_Word") == (ms, word_field, -3000)
  # addr to field
  stack_field = ms.get_field_by_name('ms_StackSize')
  addr = ms.get_field_addr(stack_field)
  assert ms.get_struct_field_for_addr(addr) == (ms, stack_field, 0)
  assert ms.get_struct_field_for_name('ms_StackSize') == (ms, stack_field)
  # getattr/setattr
  ms.ms_Word = 2000
  assert ms.ms_Word == 2000


def astruct_astruct_sub_struct_test():
  # check class
  assert SubStruct.get_type_name() == 'Sub'
  assert SubStruct.get_size() == 20
  assert len(SubStruct.get_fields()) == 3
  assert SubStruct.get_num_fields() == 3
  assert SubStruct.get_field_by_name('ss_My')
  assert SubStruct.get_field_names() == ['ss_My', 'ss_MyPtr', 'ss_SubPtr']
  assert SubStruct.get_field_offset_for_path('ss_My') == 0
  assert SubStruct.get_field_offset_for_path('ss_My.ms_SegList') == 4
  SubStruct.dump_type()
  # check instance
  mem = MockMemory()
  ss = SubStruct(mem, 0x10)
  assert str(ss) == "[AStruct:Sub,@000010+000014]"
  # data
  data = ss.read_data()
  ss.write_data(data)
  ss.dump()
  # access
  ss.write_field("ss_My.ms_Word", -3000)
  assert ss.read_field("ss_My.ms_Word") == -3000
  # create my instance
  my_field = ss.get_field_by_index(0)
  ms = ss.create_struct(my_field)
  word_field = ms.get_field_by_name('ms_Word')
  assert ss.read_field_ext("ss_My.ms_Word") == (ms, word_field, -3000)
  # addr to field
  stack_field = ms.get_field_by_name('ms_StackSize')
  addr = ms.get_field_addr(stack_field)
  assert ss.get_struct_field_for_addr(addr) == (ms, stack_field, 0)
  assert ss.get_struct_field_for_name(
      'ss_My.ms_StackSize') == (ms, stack_field)
  # getattr/setattr
  ss.ss_My.ms_Word = 2000
  assert ss.ss_My.ms_Word == 2000


def astruct_astruct_baddr_test():
  mem = MockMemory()
  ms = MyStruct(mem, 0x10)
  # write int (addr) to baddr
  ms.ms_SegList = 0x100
  # baddr auto converts back to addr
  assert ms.ms_SegList == 0x100
  # but its an BAddr
  assert type(ms.ms_SegList) is BAddr
  assert ms.ms_SegList == BAddr(0x40)
  # baddr is stored in mem
  assert mem.r32(0x14) == 0x40
  # write baddr
  ms.ms_SegList = BAddr(0x20)
  assert ms.ms_SegList == BAddr(0x20)
  assert mem.r32(0x14) == 0x20